AtomicInteger是否提供任何类型的公平性保证?比如线程的先来先服务的执行顺序?Victor Grazi's concurrent animated的动画示例绝对没有显示出任何这样的公平性。我已经找过了,但没有找到任何确凿的证据。
发布于 2012-05-25 23:36:36
不,没有这样的保证。如果有的话,就会在文档中详细说明。
仔细想想,AtomicInteger
基本上是compare-and-swap (或类似的)的一个薄薄的包装器。保证先来先服务的语义将需要线程之间的同步,这是代价高昂的,并且与AtomicInteger
的想法相反。
事情的方式是,如果有多个线程想要,比方说,并发地incrementAndGet()
相同的原子整数,它们完成竞争的顺序是未指定的。
发布于 2012-05-25 23:58:11
与你可能做的其他事情相比,它的运行速度非常快,这一点都不值钱。这意味着你极不可能得到争用,所以公平性不太可能是一个问题。
如果你调用它20亿次(你可以在几秒钟内完成),它无论如何都会溢出。如果这是一个问题,我会使用AtomicLong。
发布于 2012-05-25 23:46:55
如果你看一下源代码,你会得到正确的答案,这是YES和NO关于排序保证。它取决于被调用的方法。有些支持排序保证,有些不支持。
下面的源代码显示,根据调用的方法,它支持这两种模式。
138 /**
139 * Atomically sets the value to the given updated value
140 * if the current value {@code ==} the expected value.
141 *
142 * <p>May <a href="package-summary.html#Spurious">fail spuriously</a>
143 * and does not provide ordering guarantees, so is only rarely an
144 * appropriate alternative to {@code compareAndSet}.
145 *
146 * @param expect the expected value
147 * @param update the new value
148 * @return true if successful.
149 */
150 public final boolean weakCompareAndSet(int expect, int update) {
151 return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
152 }
如果有疑问,请阅读JavaDoc,如果仍不清楚,请阅读源代码。
https://stackoverflow.com/questions/10757284
复制相似问题