The getAndIncrement implementation of AtomicInteger

无人久伴 提交于 2019-12-02 06:23:24

问题


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?


回答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.



来源:https://stackoverflow.com/questions/19765127/the-getandincrement-implementation-of-atomicinteger

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!