AtomicInteger的getAndIncrement实现执行以下操作:
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变量的值发生了变化,该怎么办?
“秘密调味料”在此调用中:
compareAndSet(current, next)
如果在读取 后 同时更改了原始易失性值,则该compareAndSet操作将失败(并返回false),从而迫使代码继续循环。 __
compareAndSet
false