2012-04-26 67 views
5

在java4和java5及以上版本中使用volatile keyword有什么区别?在java4和java5中使用volatile关键字

和相关人士认为,

非原子变量(长/双)读/写操作时,它们被声明为挥发性 是原子。

这对java4来说是否也是如此它从java5开始是有效的?

+0

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile – Luciano 2012-04-26 14:57:30

+0

为什么你认为java4和java5与volatile关键字有什么区别? – claesv 2012-04-26 14:58:48

+5

@claesv因为有。 Java内存模型在这些版本之间改变。 – Luciano 2012-04-26 15:01:06

回答

3

人们提供了很好的观点和参考文献回答我的问题回答第一部分。在 它保证了意义

挥发性宣布长是原子(预Java 5中也有)(适用于所有JVM:

去具体到问题的第二部分,这个我读一些论坛实现)读取或写入直接到主存储器而不是两个32位寄存器。

而且

前的Java 5,挥发性是应该为长 人和双人提供这样的保证。然而,事实并非如此,在实践中经常违反这一保证。我记得 问题似乎在JDK 1.4中得到了解决,但由于它们仍然是 处理整个内存模型的事情,所以直到JDK 5,当新规则为 时,它们才真正做出任何明确的公告宣布,和记忆保证实际上意味着什么。

这是从Java语言规范,第二版:对volatile变量

17.4非原子的两倍长

负载,存储,读取处理和写入动作原子, 即使变量的类型是双倍或长。

4

有是有区别的。
直到Java 4 volatile可能会被编译器重新排序,与之前的任何读取或写入有关,从而导致微妙的并发错误,例如,使得不可能实现一个锁定(一个单身的非常常见的成语)。
在Java 5.0中修复了这个问题,它扩展了volatile的语义,这些语义无法针对任何后续读取或写入进行重新排序,并且引入了新的内存模型。你可以阅读这个Double Checked Locking例如参考

0

在java4和java5以上版本中使用volatile关键字有什么区别?

JDK5破坏之前的JMM可能无法提供预期的结果。如需更多检查: http://www.ibm.com/developerworks/library/j-jtp02244/

对非原子变量(长/双)的读/写操作在声明为volatile时是原子的。

长/双的读/写发生为两个独立的32位操作。对于两个线程来说,一个线程可能读取了更高的32位,另一个读取了长/双变量的低32位。简而言之,读/写长不像其他原语不是原子操作。 使用volatile for long/double应该能够提供这样的保证,因为易失性指令不会因编译器的易失性读/写而重新排序,而且volatile还提供了可见性保证。但是它也可能不适用于JDK 4或之前的版本。