在java4和java5及以上版本中使用volatile keyword
有什么区别?在java4和java5中使用volatile关键字
和相关人士认为,
非原子变量(长/双)读/写操作时,它们被声明为挥发性 是原子。
这对java4来说是否也是如此或它从java5开始是有效的?
在java4和java5及以上版本中使用volatile keyword
有什么区别?在java4和java5中使用volatile关键字
和相关人士认为,
非原子变量(长/双)读/写操作时,它们被声明为挥发性 是原子。
这对java4来说是否也是如此或它从java5开始是有效的?
人们提供了很好的观点和参考文献回答我的问题回答第一部分。在 它保证了意义
挥发性宣布长是原子(预Java 5中也有)(适用于所有JVM:
去具体到问题的第二部分,这个我读一些论坛实现)读取或写入直接到主存储器而不是两个32位寄存器。
而且
前的Java 5,挥发性是应该为长 人和双人提供这样的保证。然而,事实并非如此,在实践中经常违反这一保证。我记得 问题似乎在JDK 1.4中得到了解决,但由于它们仍然是 处理整个内存模型的事情,所以直到JDK 5,当新规则为 时,它们才真正做出任何明确的公告宣布,和记忆保证实际上意味着什么。
这是从Java语言规范,第二版:对volatile变量
17.4非原子的两倍长
负载,存储,读取处理和写入动作原子, 即使变量的类型是双倍或长。
本网站给出的差异一个很好的解释:http://www.javamex.com/tutorials/synchronization_volatile.shtml
他们还给出了在Java 5中挥发行为的说明,一个单独的页面上:http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml
说第一篇参考文章:“从Java 5开始,访问volatile变量会创建一个内存屏障:它有效地将所有缓存的变量副本与主内存同步” – Raedwald 2012-04-26 15:54:37
有是有区别的。
直到Java 4 volatile
可能会被编译器重新排序,与之前的任何读取或写入有关,从而导致微妙的并发错误,例如,使得不可能实现一个锁定(一个单身的非常常见的成语)。
在Java 5.0中修复了这个问题,它扩展了volatile
的语义,这些语义无法针对任何后续读取或写入进行重新排序,并且引入了新的内存模型。你可以阅读这个Double Checked Locking例如参考
在java4和java5以上版本中使用volatile关键字有什么区别?
JDK5破坏之前的JMM可能无法提供预期的结果。如需更多检查: http://www.ibm.com/developerworks/library/j-jtp02244/
对非原子变量(长/双)的读/写操作在声明为volatile时是原子的。
长/双的读/写发生为两个独立的32位操作。对于两个线程来说,一个线程可能读取了更高的32位,另一个读取了长/双变量的低32位。简而言之,读/写长不像其他原语不是原子操作。 使用volatile for long/double应该能够提供这样的保证,因为易失性指令不会因编译器的易失性读/写而重新排序,而且volatile还提供了可见性保证。但是它也可能不适用于JDK 4或之前的版本。
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile – Luciano 2012-04-26 14:57:30
为什么你认为java4和java5与volatile关键字有什么区别? – claesv 2012-04-26 14:58:48
@claesv因为有。 Java内存模型在这些版本之间改变。 – Luciano 2012-04-26 15:01:06