[英]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 效果。
- ...
所以在這種情況下, volatile
和AtomicBoolean
之間沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.