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