一 概念与基础
1、并发通信模型
在并发编程中,需要处理两个关键问题:线程间如何通信、线程之间如何同步。在命令式编程中,线程之间的通信有两种机制:共享内存和消息传递。
在共享内存模型中,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来实现隐式的通信。 在消息传递的并发模型中,线程之间必须通过明确的发送消息来显示进行通信
线程的同步是指程序用于控制线程之间操作发送相对顺序的机制。共享内存模型中,同步是显示进行的,开发人员必须制定某个方法或某段代码需要在线程之间互斥执行。消息传递模型中,由于消息的发送和接收有顺序,因此同步是隐式进行的。
2、Java并发模型
Java并发采用的是共享内存模型,线程间的通信是隐式进行的,整个通信过程对开发人员是透明的。因此需要了解线程间的通信机制。
二、Java内存模型
在Java中,实例对象、静态对象、数组元素都存放在堆内存中,所有线程之间是共享的。而局部变量、方法定义参数、异常处理器参数不在线程间共享。
Java Memory Model(JMM)是用于描述Java线程间通信的抽象概念。JMM决定一个线程对共享变量的写入何时对另一个线程可见。
从抽象角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程有一个私有的本地内存,本地内存中存储了该线程读/写共享变量的副本(本地内存是JMM的一个抽象概念,真实不存在)。JMM涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化:
从上图看出:线程A 和 B之间通信有两步:
- 首先,线程 A 把本地内存 A 中更新过的共享变量刷新到主内存中去。
- 然后,线程 B 到主内存中去读取线程 A 之前已更新过的共享变量。
三、多处理器
1、深入理解 Java 内存模型(一)——基础
2、Java并发编程基础-Java内存模型
3、Java Memory Model、对应前面的翻译
4、Java内存模型(JMM)总结