java内存模型基础

49 阅读1分钟

并发编程两个关键问题

  1. 线程以何种机制交换信息
  2. 如何控制不同线程操作发生的相对顺序

解决:

消息传递并发模型(线程间通过发消息显示通信,发消息在接受消息之前,是隐式的同步) 共享内存并发模型(通过读写内存中的公共状态,需要显示的指定那块代码需要线程互斥,java语言使用的是这种)

java内存抽象结构

image.png

对每一个线程来说,栈是私有的,堆是共享的。

image.png

线程之间的共享变量存储在主内存中,每个线程都有本地内存(抽象概念并不真实存在),存储线程读写的共享变量副本。java线程之间的通信通过java内存模型(JMM(定义了线程与主内存的抽象关系))控制。

注意:

JMM规定线程对共享变量的操作必须在自己的本地内存中进行,不能直接从主内存中读取。过程如下

  1. 现在本地内存中找这个共享变量,发现这个共享变量被更新了
  2. 本地内存去主内存中读取新值,copy到本地内存中
  3. 最后读取本地内存中更新的值

总结: JMM通过控制主内存与每个线程本地内存之间的交互,来提供内存可见性的保证