作者:php | 2023-08-31 07:01
它不是原子的,因为它是机器代码级别的多步操作.也就是说,longs和double都比处理器的字长更长.
1> Don Branson..:
它不是原子的,因为它是机器代码级别的多步操作.也就是说,longs和double都比处理器的字长更长.
取决于语言,我想.我很确定Java的原始类型在所有机器上都保证是特定的长度.
对.在64位长64位的机器上,写长可能*将是原子的,除非你在谈论JVM或其他东西.
.NET框架的"基元"也设置为特定的位长度,而不是多个字节.int是Int32的同义词,它总是32位...
注意:在java中,int是32位,long是64位(无论处理器架构如何),原始问题与java有关,也许后来添加了标签.我不确定,无论是在64位处理器上,写入是否是原子的.它将依赖于JVM到JVM.
2> daveb..:
只是为了澄清Java的情况,除非声明它们,否则不会以原子方式读取或写入双精度数和长数 volatile
JLS - 双和长的非原子疗法
这些操作在64位JVM中是原子操作,这是当前的常态
@AmrishPandey*这些操作在64位JVM中是原子的*请您分享支持链接或进一步阅读网址?
为了支持Amrish,我观看了一个有Cliff Click和Doug Lea的演示文稿(小组讨论),Cliff提出了这个观点,即在64位JVM上实现双倍和长效.所以是的Java内存模型说我们在long上严格需要volatile for atomic ops,但在64位JVM上却不是这样.
/sf/ask/17360801/.它们在Java中不是原子的,但它们在64位JVM中是原子的.如果您可以忽略32位JVM,则可以将它们视为原子.当然,如果32位JVM尝试运行您的代码,它可能会观察到[可能的并发症](http://archive.is/PuaaF#selection-8437.50-8437.73).