首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在定义长变量或双变量时,易失性关键字如何影响原子性

在定义长变量或双变量时,易失性关键字如何影响原子性
EN

Stack Overflow用户
提问于 2014-07-31 23:54:07
回答 1查看 548关注 0票数 0

我最近用java阅读了这种想法,并对以下内容感到困惑:

但是,如果在定义一个长变量或双变量时使用挥发性关键字(对于简单的赋值和返回),就会得到原子性(请注意,在SE5之前易失性不能正常工作)。

为什么在定义一个长变量或双变量时使用易失性关键字? JVM可以作为两个单独的32位操作执行64位量(长变量和双变量)的读和写,如果我将长变量或双变量定义为易失变量,则线程机制不会中断两个单独的32位操作?

整段内容如下:

原子性适用于基元类型上的“简单操作”,除了长和双。除了long和double之外,读和写原始变量作为不可分割的(原子)操作,可以保证往返于内存中。但是,JVM可以作为两个单独的32位操作执行64位量(长变量和双变量)的读写操作,这就增加了在读或写过程中可能发生上下文切换的可能性,然后不同的任务可能会看到不正确的结果(有时被称为单词撕裂,因为您可能在只更改了其中的一部分之后看到它的值)。但是,如果在定义一个长变量或双变量时使用挥发性关键字(对于简单的赋值和返回),就会得到原子性(请注意,在SE5之前易失性不能正常工作)。不同的JVM可以免费提供更强的保证,但是您不应该依赖于特定于平台的特性。

易失性字段立即写入主内存,并从主memory.So读取,即使我将长变量或双变量定义为易失性变量,32位操作也可能发生,并更改主内存中的长值或双值,当写入长值或双值包含两个32位操作时,在更改主内存中的值之前可以执行第一个32位操作。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-01 01:31:20

在这种情况下,最好只在JLS中查找:

17.7.双长非原子处理

为了Java编程语言内存模型的目的,对非易失性长值或双值的单个写入被视为两种单独的写操作:每32位半写一条。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写中看到第二32位。 写入和读取易失性长值和双值始终是原子性的。 对引用的写入和读取始终是原子的,不管它们是作为32位还是64位值实现的。

另外,“易失性字段被立即写入主内存,并从主内存读取”并不是真的。这是一种可能的实现,但是JVM实际如何实现易失性提供的保证是它自己的决定。根据底层硬件的缓存一致性协议,还有其他更好的解决方案。

另一方面,可以想象,在一些低级硬件上保证这一点会涉及到一些软件锁,以避免读/写被撕裂。效率低下?是的,但是JVM完全可以自由地这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25070808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档