3

AtomicInteger是否提供任何形式的公平保证?像先到先服务的线程执行顺序就可以了?Victor Grazi 的同步动画中的动画示例绝对没有表现出任何这样的公平性。我已经搜索并没有找到任何结论性的东西。

4

3 回答 3

6

不,没有这样的保证。如果有的话,会在文档中详细说明。

当您考虑它时,AtomicInteger它基本上是比较和交换(或类似)的薄包装。保证先到先服务的语义将需要线程之间的同步,这是昂贵的,并且与AtomicInteger.

事情的方式是,如果有多个线程想要incrementAndGet()同时处理相同的原子整数,那么它们完成比赛的顺序是未指定的。

于 2012-05-25T15:36:36.477 回答
3

与您可能做的任何其他事情相比,它的操作速度非常快,这毫无价值。这意味着您极不可能发生争用,因此公平性不太可能成为问题。

如果你调用它 20 亿次(你可以在几秒钟内完成),它无论如何都会溢出。如果这是一个问题,我会使用 AtomicLong。

于 2012-05-25T15:58:11.460 回答
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,如果仍然不清楚,请阅读源代码。

于 2012-05-25T15:46:55.293 回答