繁体   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