JMM
一、JMM介绍
JMM( Java Memory Model )称为Java内存模型
二、相关定义和特征
一、内存模型:
描述了程序中各个变量(实例域、静态域和数组元素)与主内存之间的关系
-
原子性:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程) 【比如synchronized】
- 一个操作不能被打断,要么全部执行完毕,要么不执行
- 在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。
- 可见性: 一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量的这种修改(变化)。
- 有序性:这就涉及到了一个叫做指令重排序的玩意
2、以及在实际计算机系统中将变量存储到主内存和从主内存中取出变量这样的底层细节
二、主内存和线程工作(本地)内存:
- 线程之间共享的变量(也就是实例域、静态域、数组元素)这些存储在主内存中
- 其中会为每个线程都创建一个私有的本地内存
- 对共享变量进行修改操作时,首先需要从主内存做读取相关操作
- 其次真正发生修改的地方是线程的工作内存
- 最后还需要进行写回
所以线程操作主内存也对应着八种指令:
图解:
来探讨可能出现的某些场景:
假设线程B
对Flag
进行修改为false
时,并对其写回主内存,而此时线程A
工作内存的Flag
还为true
的话,就会导致脏读(读到的数据已不为最新数据),也就是此时读到的共享变量并不具备可见性,所以
所以Java内存模型将围绕着并发编程*享变量的原子性、可见性、有序性这三个特征而建立的
三、对于以上八种指令也做出了规定: