Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java4和java5中使用volatile关键字_Java - Fatal编程技术网

在java4和java5中使用volatile关键字

在java4和java5中使用volatile关键字,java,Java,在java4和java5以后的版本中使用volatile关键字有什么区别 与此相关, 非原子变量(long/double)的读/写操作是原子的 声明为不稳定的 这对java4也是正确的吗?还是从java5开始就有效?这个网站很好地解释了这些差异: 他们还在一个单独的页面上解释了Java5中volatile的行为:是的,有区别。 多达Java 4的volatile可能会被编译器根据以前的任何读写操作重新排序,从而导致微妙的并发错误,例如无法实现双重检查锁定(对于单例来说非常常见)。 这在Java

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

与此相关,

非原子变量(long/double)的读/写操作是原子的 声明为不稳定的


这对java4也是正确的吗?还是从java5开始就有效?

这个网站很好地解释了这些差异:


他们还在一个单独的页面上解释了Java5中volatile的行为:

是的,有区别。
多达Java 4的
volatile
可能会被编译器根据以前的任何读写操作重新排序,从而导致微妙的并发错误,例如无法实现
双重检查
锁定(对于单例来说非常常见)。

这在Java 5.0中是固定的,它扩展了
volatile
的语义,该语义不能再针对任何后续读或写进行重新排序,并引入了新的内存模型。您可以阅读此示例参考资料

人们在回答我的第一部分问题时提供了很好的观点和参考资料

具体到问题的第二部分,我在某个论坛上读到:

声明为long的volatile是原子的(也是Java 5之前的版本),其含义是 它保证(对于所有JVM实现)读或写操作 直接连接到主存储器,而不是两个32位寄存器

在Java5之前,volatile应该长期提供这样的保证 双倍。然而,实际情况并非如此 实现经常违反这一保证。我记得 这个问题似乎在JDK1.4周围得到了解决,但由于它们仍然存在 在研究整个记忆模型的时候,他们并没有真正做出任何改变 直到JDK5发布新规则之前,都没有明确的公告 宣布,内存保证实际上意味着什么

这是来自Java语言规范第二版:

17.4双金属和长金属的非原子处理

对易失性变量的加载、存储、读取和写入操作是原子的, 即使变量的类型是double或long


在java4和java5之后的版本中使用volatile关键字有什么区别?

JDK5之前的JMM被破坏,并且对JDK4使用volatile可能无法提供预期的结果。要了解更多信息,请检查以下内容:

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

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

为什么您认为java4和java5在volatile关键字方面存在任何差异?@claesv,因为存在差异。Java内存模型在这两个版本之间发生了变化。作为perdantic,Java 1.4之后的版本是Java 5.0,然后是Java 6。@Luciano我不知道这一点。我真丢脸。谢谢你的链接!第一篇参考文章说:“从Java5开始,访问易失性变量会造成内存障碍:它会有效地将变量的所有缓存副本与主内存同步。”