2

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 变量的值发生了变化怎么办?

4

1 回答 1

3

“秘方”在此调用中:

compareAndSet(current, next)

如果在读取后同时更改了原始 volatile 值,则操作将失败(并返回),compareAndSet从而强制代码继续循环。false

于 2013-11-04T09:56:43.680 回答