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;
} }
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)
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.
相关文章