AtomicInteger公平吗?

时间:2012-05-25 15:33:46

标签: java integer atomic

AtomicInteger是否提供任何公平保证?喜欢先到先得的线程执行顺序吗? Victor Grazi's concurrent animated的动画示例绝对没有表现出任何这样的公平性。我搜索过,但没有找到任何结论。

3 个答案:

答案 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,如果仍然不清楚,请阅读源代码。