AtomicInteger是否提供任何公平保证?喜欢先到先得的线程执行顺序吗? Victor Grazi's concurrent animated的动画示例绝对没有表现出任何这样的公平性。我搜索过,但没有找到任何结论。
答案 0 :(得分:6)
不,没有这样的保证。如果有的话,将在文档中详细说明。
当你考虑它时,AtomicInteger
基本上是compare-and-swap(或类似)的薄包装。保证先来先服务语义需要线程之间的同步,这是昂贵的,并且与AtomicInteger
的想法相反。
事情的方式是,如果有多个线程想要同时使用相同的原子整数incrementAndGet()
,那么他们完成比赛的顺序是未指定的。
答案 1 :(得分:3)
与你可能做的任何事情相比,它的运作速度非常快。这意味着您极不可能获得争用,因此公平性不太可能是一个问题。
如果你称之为20亿次(你可以在几秒钟内完成),那么无论如何都会过度流动。如果这是一个问题,我会使用AtomicLong。
答案 2 :(得分:1)
如果您查看来源,您将获得正确答案,是和否有关订购保证。 这取决于所调用的方法。有些支持订购保证,有些则不支持。
以下来源显示它支持两种模式,具体取决于调用的方法。
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,如果仍然不清楚,请阅读源代码。