3

假设之前的代码(AtomicInteger a).addAndGet(-1)将始终在此调用之前执行是否安全,即 JVM不会重新排序调用周围的指令addAndGet

如果是,是否可以安全地假设检查同一AtomicInteger实例(例如if (a.compareAndSet(0, -1)))状态的其他线程将看到第一个线程在addAndGet调用之前已更改的所有内容?

4

1 回答 1

6

假设 (AtomicInteger a).addAndGet(-1) 之前的代码将始终在此调用之前执行是否安全,即 JVM 不会重新排序 addAndGet 调用周围的指令?

是的,这是正确的。将addAndGet发出一个易失性存储(或类似的),因此其他负载和存储不能在其下重新排序。

编辑:感谢 Soitrios 链接https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html,这表明您已建立订购。

  • get 具有读取 volatile 变量的记忆效应。
  • set 具有写入(分配)易失性变量的记忆效应。
  • compareAndSet 和所有其他读取和更新操作(例如 getAndIncrement)具有读取和写入 volatile 变量的记忆效应。
于 2015-09-24T15:20:26.437 回答