并发编程中的关键问题
-
线程之间如何通信
-
共享内存的并发模型中:线程之间通过读写内存中的公共状态来隐式进行通信
-
信息传递的并发模型中:线程之间没有公共状态,线程间通过明确的发送信息方式来显性进行通信
-
-
线程之间如何同步
-
共享内存的并发模型中:同步是显性进行的,程序员通过显式指定某个方法或代码在线程之间互斥执行
-
信息传递的并发模型中:由于信息的阿松必须在消息的接收之前,因此同步是隐式进行的
-
线程: 并发执行的活动实体
通信: 指的是线程之间以何种机制交换信息
同步: 是指程序用户控制不同线程之间操作发生相对顺序的机制
JAVA 的内存模型(JMM)
java 采用的是:共享内存模型
特点是 :通信是隐形进行的,同步是显性进行的。整个通信过程对程序员完全透明
JMM 控制线程间通信,决定一个线程对共享变量的写入何时对另一个线程可见
JAVA 内存模型(JMM)抽象
-
存在线程共享:有内存可见性问题,受内存模型影响
-
堆内存,(包含,实例域,静态域,数组元素;这些元素使用”共享变量”这个术语来代指)
-
-
不存在线程共享:不会有内存可见性问题,不受内存模型影响
-
方法定义参数
-
异常处理参数
-
JMM 线程与主内存间的抽象关系
线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory);本地内存中存储了该线程以读/写共享变量的副本
本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他硬件和编译器优化。
线程A与B间通信步骤
-
线程A将本地内存A中更新过的共享变量刷新入主内存中去
-
线程B到主内存中去读取线程A之前已经更新过的共享变量
这两个步骤的实质是线程A通过主内存向线程B发送消息。JMM通过控制主内存与每个线程的本地内存间的交互,来为程序员挺内存可见性的保证。
线程的通信机制
共享内存和信息传递