《深入理解JAVA虚拟机》读书笔记11

Java内存模型与线程
一、对于volatile型变量的特殊规则
1、volatile是Java虚拟机提供的最轻量级的同步机制,但是在使用的时候要注意它的使用规则。
当一个变量被修饰为volatile之后,它就具备两种特性,第一是保证此变量对所有线程可见性,这里的可见行是指当
一个线程修改了这个变量的值,新值对于其他线程来说是可以立刻知道的,而普通变量不能做到这一点,变量的值在
线程间的传递均徐亚通过主内存来完成。第二是禁止重排序优化,普通的变量仅仅会保证在该方法的执行过程中所有
的依赖赋值结果的地方都能得到正确的结果,而不能保证变量赋值操作的顺序于程序代码中的执行顺序一致,因为在一个
线程的方法执行过程中无法感知到这一点。
在某些情况下,volatile的同步机制的性能要优于锁,但是由于虚拟机对锁实行了许多消除和优化,所有很难量化的说
volatile就会比synchronized快许多。
2、对于long、double类型的特殊规则
Java内存模型要求lock,unlock,read,load,assign,use,store,write这八个操作都具有原子性,但是对于64位的数据类型,
允许虚拟机将没有被volatile修饰的64为数据的读写操作划分为两次32位的操作来进行,即允许虚拟机可以不保证64位
数据类型的load,store,read,write四个操作的原子性。
3、原子性、可见性、有序性
Java并发处理的三个重要的特征就是原子性、可见性、有序性。
原子性:由java内存模型来直接保证的原子性变量操作包括read,load,assign,use,store,write这六个。我们大致可以认为基本数据类型
的访问读写都具备原子性。
可见性:可见性就是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。Java内存模型是通过在变量修改后将新值同步回主
内存,在变量读取前从主内存刷新变量值这中依赖主内存的方式来实现可见性的,无论是普通变量还是volatile修饰的变量都是如此,普通变量与
volatile变量的区别是volatile变量的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。除了volatile变量外,java还有两个
关键子能够保证可见性,这两个是:synchronized 和final.
有序性:如果在本内存观察,所有的操作都是有序的。
4、先行发生原则
java语言有一个先行发生原则,这个原则非常重要,它是判断是否存在竞争,线程是否安全的主要依据。
java虚拟机使用的八大先行发生原则:
程序次序原则:在一个线程内,按照程序代码的顺序,书写前面的操作先行发生于书写后买呢的操作。
管程锁定原则:一个unlock操作先行发生于后面同一个对这个变量的读操作。
volatile原则:对一个volatile变量的写操作优先发生于后面对这个变量的读操作。
线程启动规则:Tread对象的start(),方法先行发生于对此线程的每一个操作。
线程终止原则:线程中的所有操作都优先发生于对此线程的终止检测
线程中断原则:对线程的interrupt()方法的调用先行发生于被中断线程的代码检测到
中断事件的发生。
对象终结原则:一个对象的初始化完成先行发生于它的finalize()方法的开始。
传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,则操作A先行发生于操作C。







#笔记##读书笔记#
全部评论

相关推荐

12-27 22:46
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务