《深入理解Java虚拟机》(三)--Java内存模型与线程(2)

2018-06-01  本文已影响23人  蓝色_fea0

1/4 对于long和double变量的特殊规则

Java内存模型于要求lock、unlock、read....等8个操作都具有原子性,但是对于64位的数据类型(long和double),在模型中定义了一条相对宽松的规定:允许虚拟机将没有被volatile修饰的64位变量划分成两次32位操作来进行,即允许虚拟机可以不保证64位数据类型的load、store、read、write这四个操作的原子性,这就是long和double的非原子协议,但是目前各种平台下都将64位的数据的读写操作作为原子操作来对待,所以这个规则其实并没有什么卵用...

1/5 原子性、可见性和有序性

Java的内存模型其实就是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的,我们来看一下哪些操作实现了这三个特性。

1/6 先行发生原则

Java内存模型中,如果所有的有序性都靠volatile和synchronize来维护那么就会变得很繁琐,所以Java语言中有一个“先行发生原则”,它是判断数据之间是否存在竞争、线程是否安全的主要根据,同过这个原则可以解决判断并发环境下两个操作是否安全的问题。先行发生原则就是如果操作A先行发生于操作B,那么操作A对数据的所有影响就能同步到操作B,也就能保证线程安全。
下面是一些“天然的”先行发生关系。如果两个操作之间的关系不在下面这些规则里面,那么它就不能保证程序的顺序性。

上一篇 下一篇

猜你喜欢

热点阅读