我试图了解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()
以从寄存器中获取更新的值?
答案 0 :(得分:0)
这是为了提高并发性。
如果它返回next
,则该方法必须具有同步代码,否则另一个线程可以修改设置它并返回它之间的值。
通过不返回next
,只有实际修改需要在一个地方同步,将同步的责任和优化放在一起; compareAndSet()
。当方法之间共享同步时,协调安全状态更改会复杂得多。