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