Java并发——核心理论

并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是notify waitsynchronizedvolatile亦或是java.util.conccurrent包下的ReentrantLockThreadPoolExecutor都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。

1 共享性

数据共享性是线程安全的主要原因之一。如果数据只在某一个线程中被访问则不存在共享性问题。然而在多线程环境下常常是多个线程共享一部分数据,为保证在多线程环境下共享数据的一致性,必须引入进程间的同步机制。

2 互斥性

资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。例如,对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。但是对共享数据的写操作,一般就需要保证互斥性。Java 中提供多种机制来保证互斥性,最简单的方式是使用Synchronized。

3 原子性

所谓原子性指的是一系列不可分割的,独立的操作,换句话说就是如果执行一个原子性操作,要么不执行,要么执行完该原子性操作,不会出现只做一半的情况。最底层的原子性操作是操作系统的指令。但Java层面的操作往往是由多个原子性操作构成的,要保证Java操作的原子性最常见的方式就是加锁,如Java中的Synchronized或Lock都可以实现,代码段二就是通过Synchronized实现的。除此之外还有一种方式是CAS(Compare And Swap):即修改数据之前先比较与之前读取到的值是否一致,如果一致,则进行修改,如果不一致则重新执行,这也是乐观锁的实现原理。

4 可见性

在多线程环境下,每一个线程都维护一个本地的工作内存,线程操作一个共享变量时并不是直接操作在主内存中的变量,而是将其先拷贝到自己工作内存后再就行修改,同时在修改完成后再同步到主内存。而所谓可见性就是当某一个线程改变某一共享变量后,另一线程可以感知到这一变化。Java中通过Synchronizedvolatile来保证可见性。

5 有序性

学过体系结构的朋友都知道,为了提高程序运行的效率,CPU会对指令进行重排序,以实现指令级并行。其实在现代操作系统中,除了指令级重排序外,编译器和内存系统也会进行相应的重排序以提升效率。

在单线程环境下,以上的重排序是不会改变程序的运行逻辑的。但是到了多线程环境,这样的重排序则可能导致逻辑错乱。Java中通过Synchronizedvolatile来保证顺序性。

时间: 2024-10-31 10:54:00

Java并发——核心理论的相关文章

Java 并发编程学习笔记之核心理论基础_java

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系列会从线程间协调的方式(wait.notify.notifyAll).Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制.在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式.实现源码及其背后的原理.本

推荐阅读Java并发性领域编程最值得一读的力作《JAVA并发编程实践》

我的第一次之给<JAVA并发编程实践>写推荐序英文书名:Java Concurrency in Practice 中文书名:JAVA并发编程实践 这是一本入围17届Jolt大奖的书,虽然最终他没有获奖,但是这只是与政治有关的.:) 推荐序原文如下: http://book.csdn.net/bookfiles/398/10039814644.shtml 在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺.即使并发性编程还没进入到您的 J

《Java 并发编程的艺术》迷你书

本文源自InfoQ发表的<Java 并发编程的艺术>电子书  作者:方腾飞  序言:张龙 免费下载此迷你书 推荐序 欣闻腾飞兄弟的<聊聊并发>系列文章将要集结成InfoQ迷你书进行发布,我感到非常的振奋.这一系列文章从最开始的发布到现在已经经历了两年多的时间,这两年间,Java世界发生了翻天覆地的变化.Java 7已经发布,而且Java 8也将在下个月姗姗来迟.围绕着JVM已经形成了一个庞大且繁荣的生态圈,Groovy.Scala.Clojure.Ceylon等众多JVM语言在蓬勃

Java并发编程:从根源上解析volatile关键字的实现

Java并发编程:volatile关键字解析 1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程访问的变量为共享变量. 也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题. 为了解决缓存不一致性问题,通常来说有以下2种解决方法: 通过在总线加LOCK#锁的方式 通过缓存一致性协议 这2种方式

JAVA并发(三)

并发 Table of Contents 1 什么是并发问题. 2 java中synchronized的用法 3 Java中的锁与排队上厕所. 4 何时释放锁? 5 Lock的使用 6 利用管道进行线程间通信 7 阻塞队列 8 使用Executors.Executor.ExecutorService.ThreadPoolExecutor 9 并发流程控制 10 并发3定律 11 由并发到并行 1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 银行两操作

Java 并发工具包 java.util.concurrent 用户指南

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html. 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载. 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平

【JAVA秒会技术之多线程】Java 并发工具包 java.util.concurrent 用户指南

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类.本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异.

Java并发编程之性能、扩展性和响应_java

本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实现. 1.性能 我们都知道,多线程可以用来提高程序的性能,背后的原因在于我们有多核的CPU或多个CPU.每个CPU的内核都可以自己完成任务,因此把一个大的任务分解成一系列的可彼此独立运行的小任务就可以提高程序的整体性能了.可以举个例子,比如有个程序用来将硬盘上某个文件夹下的所有图片的尺寸进行修改,应用多线程技

Java并发编程:线程池的使用(转)

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool