Sta*_*lin 4 java concurrency memory-management
我正在学习java.util.concurrent库,并在源代码中找到许多无限循环,就像这个
//java.util.concurrent.atomic.AtomicInteger by Doug Lea
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道,在什么情况下实际值不能等于预期值(在这种情况下compareAndSet返回false)?
Mic*_*rdt 10
许多现代CPU已compareAndSet()映射到原子硬件操作.这意味着,它是线程安全的而不需要同步(相比之下,这是一个相对昂贵的操作).但是,它compareAndSet()本身只有原子,所以为了getAndSet()(即将变量设置为给定值并返回它当时具有的值,而不可能将它设置为其间的不同值),代码使用了技巧:首先它获取值,然后尝试compareAndSet()使用它刚刚获得的值和新值.如果失败,则变量由中间的另一个线程操纵,代码再次尝试.
如果compareAndSet()很少失败,这比使用同步更快,即如果没有太多线程同时写入变量.在许多线程始终写入变量的极端情况下,同步实际上可以更快,因为虽然存在同步开销,但是其他尝试访问变量的线程将等待并在轮到它时被唤醒,而不是必须重复重试该操作.