Long和double需要64位内存。这导致这些类型需要两个地址空间。Long,Double和64位内存
在64位JVM的是,这仍然是这样吗?由于这些值现在可以适合单个地址空间,因此这意味着这些类型现在存储在单个地址空间中吗?
这是否对线程有影响,在这些类型上需要使用volatile来确保 每个单独的地址空间不会乱序更新?
Long和double需要64位内存。这导致这些类型需要两个地址空间。Long,Double和64位内存
在64位JVM的是,这仍然是这样吗?由于这些值现在可以适合单个地址空间,因此这意味着这些类型现在存储在单个地址空间中吗?
这是否对线程有影响,在这些类型上需要使用volatile来确保 每个单独的地址空间不会乱序更新?
这仍然是这种情况。 JVM规范,未改变64位的JVM:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7
哇!我认为这个问题很久以前就消失了。 – OldCurmudgeon
@OldCurmudgeon - 它在实践中,但不是在规范中。 – jtahlborn
@jtahlborn然后没有必要使用volatile,因为这些类型存储在一个64位块,即使spec说不同? –
Java的应该是虚拟机独立:所以这意味着Java程序总是执行同样的方式,不管它的方式在虚拟机实现... –
@CommuSoft严格来说,这是不正确的。你得到同样的保证。但这些担保没有涵盖的内容可以自由更改。所以64位虚拟机允许(实际上鼓励)把'double'和'long'写成原子,但是你不能保证它会发生。 – biziclop
参考先前的回答像http://stackoverflow.com/questions/25173208/value-integrity-guarantee-for-concurrent-long-writes-in-64-bit-openjdk-7-8 – JiriS