AtomicInteger 的 getAndIncrement 实现

2022-01-22 00:00:00 atomic synchronization java volatile

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.

相关文章