并发编程两个关键问题
- 线程以何种机制交换信息
- 如何控制不同线程操作发生的相对顺序
解决:
消息传递并发模型(线程间通过发消息显示通信,发消息在接受消息之前,是隐式的同步) 共享内存并发模型(通过读写内存中的公共状态,需要显示的指定那块代码需要线程互斥,java语言使用的是这种)
java内存抽象结构
对每一个线程来说,栈是私有的,堆是共享的。
线程之间的共享变量存储在主内存中,每个线程都有本地内存(抽象概念并不真实存在),存储线程读写的共享变量副本。java线程之间的通信通过java内存模型(JMM(定义了线程与主内存的抽象关系))控制。
注意:
JMM规定线程对共享变量的操作必须在自己的本地内存中进行,不能直接从主内存中读取。过程如下
- 现在本地内存中找这个共享变量,发现这个共享变量被更新了
- 本地内存去主内存中读取新值,copy到本地内存中
- 最后读取本地内存中更新的值
总结: JMM通过控制主内存与每个线程本地内存之间的交互,来提供内存可见性的保证