【发布时间】:2015-12-22 06:36:18
【问题描述】:
是否可以假设(AtomicInteger a).addAndGet(-1) 之前的代码将始终在此调用之前执行,即 JVM 将不会重新排序 addAndGet 调用周围的指令?
如果是,是否可以假设检查同一AtomicInteger 实例(例如if (a.compareAndSet(0, -1)))状态的其他线程将看到第一个线程在addAndGet 调用之前更改的所有内容?
【问题讨论】:
-
我相信你只能依赖 set 发生之前的事实——在获取特定的 AtomicInteger 之前。
-
要吹毛求疵,您永远无法保证执行某事的时间,而是保证可观察到的效果。但这实际上是你感兴趣的。你不应该忽略在
if(a.compareAndSet(…))内,你只会保证看到线程所做的更改,这些线程将值转换为期望值。因此,您必须确保没有多种方法可以达到该值…… -
@Holger,在这种情况下有什么帮助?我必须看到所有线程的变化,这减少了
a的值,最后一个使其为零的线程必须使用从所有线程收集的数据。 -
只要有恰好个线程将值减小到零,就没有问题。您不得拥有可以再次增加数量的线程(在检测到零之前)并且不得超过必要的线程数。例如。如果你从
a=5开始,并且有六个递减线程,当达到零时,一个线程可能不同步,你不知道是哪一个。但如果你正好有五个递减线程,你就知道所有线程都必须通过障碍......
标签: java multithreading concurrency jvm atomicinteger