多核运行的环境下,由于每个CPU都有自己的读写缓存,导致的是一个线程上写的内容,不一定在另一个线程里可见。
JMM(Java memory model)做为语言级别的内存模型,为程序员提供易于理解的内存模型(通过volatie和锁机制,在编译的时候插入内存屏障,限制处理器的指令重排),同时尽量放松对处理器指令重排的限制(处理器重排指令,是为了更好利用处理器的缓存,提升效率).
Break it down:
1. volatile:
1.1 对volatile变量的读写,都等价于加了锁的操作
1.2 对volatile变量的写,相当于释放锁; 对volatile变量的读,相当与获取锁.
原因:对volatile变量的写,会把处理器写缓存的数据写到主内存
对volatile变量的读,之前会从主内存中读入数据到处理器缓存
所以保证了:如果volatile变量的写在volatile变量的读之前,那么volatile写之前包括对volatie变量的写操作,对volatile变量的读和之后的操作可见
2. 锁
通过volatile变量+CAS操作,构建出一套程序员易于编程的多线程同步工具。
(java的lock不是busy wait的,应该是sleep的。 回忆unix网络编程第二卷:进程间通信, mutex是需要不断轮询的,condition是可以睡在上面和唤醒的,可以用mutex+condition实现锁)
3. final
主要是对final变量的初始化,和包含它的构造函数,限制重排序(以加入内存屏障的方式)。以达到如果对象的引用可用,那么final变量一定是被正确初始化了的。
参考:
http://ifeve.com/java-memory-model-0/
分享到:
相关推荐
深入理解Java内存模型 pdf 超清版
理解java内存模型的一本不错的书。
深入理解JAVA内存模型.pdf (高清版) 1.基础 2.重排序 3.顺序一致性 4.voltile 5.锁 6.FInal 7.总结。。。等等
深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM
Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main ...
java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰java程序员,本文试图揭开java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重...
深入理解Java内存模型
Java 内存模型的抽象 4 重排序 6 处理器重排序与内存屏障指令 7 happens-before 10 重排序 13 数据依赖性 13 as-if-serial 语义 13 程序顺序规则 15 重排序对多线程的影响 15 顺序一致性 19 数据竞争与顺序...
深入Java 内存模型本书介绍了,如何深入学习了解JAVA 内存模型!更好的了解java 虚拟机!
通过这个电子版,可以对JAVA的内存模型有一定的认识,使自己成为熟悉底层的高手
深入理解Java内存模型,让你明白java内存的工作原理。
读深入理解JAVA内存模型整理的思维导图 本人记忆差,整理这个思维导图,相当于较认真的看了一遍,整个思维导图,基本上就是对原文的拷贝。 有了层级关系。和本人自己的一些理解。由于思维导图弄出来的图片大于100M了...
资源名称:深入理解JAVA内存模型资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
深入理解JAVA内存模型
深入理解JAVA内存模型.pdf