首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AtomicInteger公平吗?

AtomicInteger公平吗?
EN

Stack Overflow用户
提问于 2012-05-25 23:33:46
回答 3查看 342关注 0票数 3

AtomicInteger是否提供任何类型的公平性保证?比如线程的先来先服务的执行顺序?Victor Grazi's concurrent animated的动画示例绝对没有显示出任何这样的公平性。我已经找过了,但没有找到任何确凿的证据。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-25 23:36:36

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

仔细想想,AtomicInteger基本上是compare-and-swap (或类似的)的一个薄薄的包装器。保证先来先服务的语义将需要线程之间的同步,这是代价高昂的,并且与AtomicInteger的想法相反。

事情的方式是,如果有多个线程想要,比方说,并发地incrementAndGet()相同的原子整数,它们完成竞争的顺序是未指定的。

票数 6
EN

Stack Overflow用户

发布于 2012-05-25 23:58:11

与你可能做的其他事情相比,它的运行速度非常快,这一点都不值钱。这意味着你极不可能得到争用,所以公平性不太可能是一个问题。

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-25 23:46:55

如果你看一下源代码,你会得到正确的答案,这是YESNO关于排序保证。它取决于被调用的方法。有些支持排序保证,有些不支持。

下面的源代码显示,根据调用的方法,它支持这两种模式。

代码语言:javascript
运行
复制
  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,如果仍不清楚,请阅读源代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10757284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档