我相信这Atomic*
实际上给出了原子性和波动性。因此,当您致电 (say) 时AtomicInteger.get()
,您一定会获得最新的价值。这记录在java.util.concurrent.atomic
包文档中:
原子访问和更新的记忆效应通常遵循 volatile 的规则,如 Java™ 语言规范第 17.4 节所述。
- get 具有读取 volatile 变量的记忆效应。
- set 具有写入(分配)易失性变量的记忆效应。
- lazySet 具有写入(分配)易失性变量的记忆效应,除了它允许对后续(但不是先前)内存操作进行重新排序,这些操作本身不会对普通的非易失性写入施加重新排序约束。在其他使用上下文中,> -lazySet 可能在清空时应用,为了垃圾收集,一个永远不会再次访问的引用。
- weakCompareAndSet 以原子方式读取和有条件地写入变量,但不会创建任何发生前的顺序,因此对于除weakCompareAndSet 的目标之外的任何变量的先前或后续读取和写入不提供任何保证。
- compareAndSet 和所有其他读取和更新操作(例如 getAndIncrement)具有读取和写入 volatile 变量的记忆效应。
现在如果你有
volatile AtomicInteger count;
该volatile
部分意味着每个线程都将使用最新的AtomicInteger
引用,并且它AtomicInteger
意味着您还将看到该对象的最新值。
需要这个并不常见(IME) - 因为通常您不会重新分配count
以引用不同的对象。相反,您将拥有:
private final AtomicInteger count = new AtomicInteger();
在这一点上,它是一个final
变量的事实意味着所有线程都将处理同一个对象 - 而它是一个Atomic*
对象的事实意味着它们将看到该对象中的最新值。