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变量的值发生了变化怎么办?
答案 0 :(得分:3)
这个电话中有“秘密酱”:
compareAndSet(current, next)
{<3}}操作将失败(并返回false
)如果原始易失性值在读取后同时更改,则强制代码继续循环。