假设之前的代码(AtomicInteger a).addAndGet(-1)
将始终在此调用之前执行是否安全,即 JVM不会重新排序调用周围的指令addAndGet
?
如果是,是否可以安全地假设检查同一AtomicInteger
实例(例如if (a.compareAndSet(0, -1))
)状态的其他线程将看到第一个线程在addAndGet
调用之前已更改的所有内容?
假设之前的代码(AtomicInteger a).addAndGet(-1)
将始终在此调用之前执行是否安全,即 JVM不会重新排序调用周围的指令addAndGet
?
如果是,是否可以安全地假设检查同一AtomicInteger
实例(例如if (a.compareAndSet(0, -1))
)状态的其他线程将看到第一个线程在addAndGet
调用之前已更改的所有内容?
假设 (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 变量的记忆效应。