Java AtomicInteger getAndIncrement()和compareAndSet

时间:2016-10-10 17:27:54

标签: java multithreading nonblocking compare-and-swap

我试图了解getAndIncrement中的current是如何更新的,这是一段代码。

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

我理解compareAndSet将比较当前值是否与寄存器中存储的值相同,如果相同则更新寄存器中的值。

我不理解的部分是,为什么它不会返回next而不是current

当进入循环时,current被设置为int而current不是参考值,所以如果current初始化为5,那么当它返回当前时,它应该是5 ?或者当它返回current时,current会再次调用get()以从寄存器中获取更新的值?

1 个答案:

答案 0 :(得分:0)

这是为了提高并发性。

如果它返回next,则该方法必须具有同步代码,否则另一个线程可以修改设置它并返回它之间的值。

通过不返回next,只有实际修改需要在一个地方同步,将同步的责任和优化放在一起; compareAndSet()。当方法之间共享同步时,协调安全状态更改会复杂得多。