什么是JMM
JMM即Java Memory Model 是一种内存模型规范;保证了Java程序在各种平台下对内存的访问都能保证效果一致。
为什么要有JMM
由于CPU发展超前,内存的读写速度也远远赶不上cpu,因此cpu厂商在每颗cpu上加上高速缓存用于缓解这种情况。
但是引来的新的问题:缓存一致性。
在多核cpu中,每个处理器都有各自的高速缓存(L1,L2,L3),而主内存(就是内存条那块的内存)却只有一个;当程序运行时,需要将主内存的数据拷贝一份到高速缓存进行运算、赋值等操作,完毕之后需要将这些数据刷新到主内存中,此时可能出现多个处理器缓存中的数据和主内存数据不一致的情况。
处理器优化和指令重排
除了缓存一致性问题,处理器优化的问题也同样重要,例如处理器执行以下逻辑:
a=1;
b=2;
可能a此时正在被锁定,处理器为了保证不处于等待状态,可能先执行b=2这一步操作;以保证资源尽量的被充分利用。
以上的情况就属于指令重排序 。
为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。
JMM做了什么
JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步。
JMM规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存。
线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝。
线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。
不同的线程之间也无法直接访问对方工作内存中的变量。
线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。
JMM内存交互操作
关于主内存和线程工作内存中的变量如何交互,JMM定义了八种操作:
名称
作用于
含义
lock(锁定)
主内存
把一个变量标识为一条线程独占状态
unlock(解锁)
主内存
释放主内存变量锁定状态,以便于其他线程访问
read(读取)
主内存
把一个变量值从主内存传输到线程的工作内存中,以便于load使用
load(载入)
工作内存
把read操作从主内存中得到的变量值放入工作内存的变量副本中
use(使用)
工作内存
把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作
assign(赋值)
工作内存
它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store(存储)
工作内存
把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
write(写入)
主内存
它把store操作从工作内存中一个变量的值传送到主内存的变量中
XXXXXXXXXX
XXXXXXXXXX
文章来源: www.oschina.net,作者:rooooooot,版权归原作者所有,如需转载,请联系作者。
原文链接:https://my.oschina.net/u/3457546/blog/3102058