【发布时间】:2017-01-06 08:58:30
【问题描述】:
我有一个运行多线程的程序,所有线程共享和处理单个 AtomicLong 变量。他们每个人都会首先调用getAndAdd()方法来检索值并进一步处理。
如果所有线程同时运行,调用上述方法是否会导致一个线程等待另一个线程完成获取值?
【问题讨论】:
标签: java multithreading atomic-long
我有一个运行多线程的程序,所有线程共享和处理单个 AtomicLong 变量。他们每个人都会首先调用getAndAdd()方法来检索值并进一步处理。
如果所有线程同时运行,调用上述方法是否会导致一个线程等待另一个线程完成获取值?
【问题讨论】:
标签: java multithreading atomic-long
线程没有等待(在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 指令)
【讨论】:
getAndAdding 之外什么都不做,您会注意到 CPU 使用率很高,但这是不现实的情况。