AtomicInteger的getAndIncrement实现 [英] The getAndIncrement implementation of AtomicInteger
问题描述
AtomicInteger的getAndIncrement实现执行以下操作:
The getAndIncrement implementation of AtomicInteger does the following:
public final int getAndIncrement() {
for (;;) {
int current = get(); // Step 1 , get returns the volatile variable
int next = current + 1;
if (compareAndSet(current, next))
return current;
} }
这不等于aVolatileVariable ++吗? (我们知道这是不正确的用法).如果没有同步,我们如何确保此完整操作是原子的?如果在步骤1中读取了变量"current"后,volatile变量的值发生了变化,该怎么办?
Isn't it an equivalent of aVolatileVariable++? (which we know is not a correct usage). Without synchronization, how are we ensuring that this complete operation is atomic? What if the value of the volatile variable changes after the variable 'current' is read in Step 1?
推荐答案
秘密调味料"在此调用中:
The "secret sauce" is in this call:
compareAndSet(current, next)
同时更改了原始易失性值,则"nofollow"> compareAndSet
操作将失败(并返回false
),从而迫使代码继续执行循环.
The compareAndSet
operation is going to fail (and return false
) if the original volatile value has been changed concurrently after the read, forcing the code to continue with the loop.
这篇关于AtomicInteger的getAndIncrement实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!