AtomicLong中的getAndAdd方法会导致线程等待吗?

时间:2017-01-06 08:58:30

标签: java multithreading atomic-long

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

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

1 个答案:

答案 0 :(得分:3)

线程没有等待(在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指令)