Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The getAndIncrement implementation of AtomicInteger

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?

like image 799
Gaurav Avatar asked Aug 06 '26 07:08

Gaurav


1 Answers

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.

like image 140
Sergey Kalinichenko Avatar answered Aug 08 '26 21:08

Sergey Kalinichenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!