繁体   English   中英

在 64 位 JVM 上读取和写入双原子?

[英]On a 64 bit JVM is reading and writing of a double atomic?

我正在对 Java 代码的正确同步进行一些研究,并且遇到了多个实例,如果声明双精度和长整数的读/写不是原子的。

所以我写了一个简单的基准测试,发现双精度通常更快(一根头发),唯一一次我注意到一个很大的不同是当我在代码中出现错误并且我在双精度和浮点数之间来回转换(保留为第 3测试用例)。 一旦数学是纯双精度或纯浮点数,基准几乎完全相同。 (Java 1.8,64 位 Oracle JVM)

但是,我读过双倍和长读和写不是原子的,而是被 JVM 视为 2 个 32 位读写。

我不应该期待性能差异吗?

 public class Benchmark { static double loopDouble (double aAddValue) { double tResult = 0.0; while (tResult < 10000000.0) { tResult += aAddValue; } return tResult; } static double loopFloat (float aAddValue) { double tResult = 0.0; while (tResult < 10000000.0) { tResult += aAddValue; } return tResult; } static float loopFloatFloat (float aAddValue) { float tResult = 0.0f; while (tResult < 10000000.0f) { tResult += aAddValue; } return tResult; } static double loopInt (int aAddValue) { double tResult = 0.0; while (tResult < 10000000.0) { tResult += aAddValue; } return tResult; } public static void main(String[] args) { long doubleTimeNs = - System.nanoTime(); loopDouble(1.0); doubleTimeNs += System.nanoTime(); long floatTimeNs = - System.nanoTime(); loopFloat(1.0f); floatTimeNs += System.nanoTime(); long floatfloatTimeNs = - System.nanoTime(); loopFloatFloat(1.0f); floatfloatTimeNs += System.nanoTime(); long intTimeNs = -System.nanoTime(); loopInt(1); intTimeNs += System.nanoTime(); long doubleTime2Ns = - System.nanoTime(); loopDouble(1.0); doubleTime2Ns += System.nanoTime(); System.out.println("Double: " + doubleTimeNs + " (" + doubleTime2Ns + ") "+ " Float: " + floatTimeNs + " Float-float: " + floatfloatTimeNs + " Int: " + intTimeNs); } } Double: 23944257 (23736683) Float: 24220307 Float-float: 24134056 Int: 25745599

Kelly Denehy 指出。 JLS 第 17.7 节

“对于 Java 编程语言 memory model 而言,对非易失性 long 或 double 值的单次写入被视为两个单独的写入。在每个线程中,a 32 被视为两个单独的写入。一次写入的 64 位值的前 32 位,以及另一次写入的后 32 位。

volatile long 和 double 值的写入和读取始终是原子的。

对引用的写入和读取始终是原子的,无论它们是作为 32 位还是 64 位值实现的。 "

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM