簡體   English   中英

volatile 和 atomic 的區別

[英]Differences between volatile and atomic

int value = 0;
volatile boolean done = false;

// Thread A:
value = 1; done = true;

// Thread B:
if (done) System.out.println(value);

這很好,因為 done 被定義為 volatile。

相同的代碼呢,除了 done 被定義為 AtomicBoolean 之外 - 它是否達到相同的效果? 換句話說,原子(RMW)操作除了原子和可見之外,是否還保證所有先前的寫入都刷新到共享的 memory?

int value = 0;
AtomicBoolean done = new AtomicBoolean(false);

// Thread A:
value = 1; done.set(true);

// Thread B:
if (done.get()) System.out.println(value);

來自java.util.concurrent的 Javadoc

用於訪問和更新原子的 memory 效果通常遵循 volatile 的規則,如 Java 語言規范(17.4 Memory 模型)中所述

  • get 具有讀取 volatile 變量的 memory 效果。
  • set 具有寫入(分配)易失性變量的 memory 效果。
  • ...

所以在這種情況下, volatileAtomicBoolean之間沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM