【问题标题】:Does getAndAdd method in AtomicLong cause threads waiting?AtomicLong 中的 getAndAdd 方法是否会导致线程等待?
【发布时间】:2017-01-06 08:58:30
【问题描述】:

我有一个运行多线程的程序,所有线程共享和处理单个 AtomicLong 变量。他们每个人都会首先调用getAndAdd()方法来检索值并进一步处理。

如果所有线程同时运行,调用上述方法是否会导致一个线程等待另一个线程完成获取值?

【问题讨论】:

    标签: java multithreading atomic-long


    【解决方案1】:

    线程没有等待(在Object::wait 的意义上),它们一直在循环,直到成功获取并添加到AtomicLong

    作为参考,the code in JDK 8 看起来像这样:

    public final long getAndAddLong(Object o, long offset, long delta) {
      long v;
      do {
        v = getLongVolatile(o, offset);
      } while (!compareAndSwapLong(o, offset, v, v + delta));
      return v;
    }
    

    请注意,该方法可能是固有的(即,它在运行时被更高效的东西替换,通常是单个 CPU 指令)

    【讨论】:

    • 他们在循环,你的意思是他们在获得价值之前什么都不做?我想知道它会影响性能吗?
    • 他们不会什么都不做,他们会循环(忙于等待),因此他们将使用 100% 的 cpu。但这在正常竞争条件下不会持续很长时间。当然,如果您的程序有数千个线程除了getAndAdding 之外什么都不做,您会注意到 CPU 使用率很高,但这是不现实的情况。
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多