簡體   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