【发布时间】:2017-02-19 04:36:48
【问题描述】:
我试图了解 getAndIncrement 中的 current 是如何更新的,这是那段代码。
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
我知道 compareAndSet 会比较当前值是否与寄存器中存储的值相同,如果相同则用 next 更新寄存器中的值。
我不明白的部分是为什么它不返回next 而不是current。
进入循环时,current被设置为int,current不是参考值,所以如果current初始化为5,那么返回current时,应该也是5吗?或者当它返回current时,current会再次调用get()从寄存器中获取更新的值?
【问题讨论】:
-
因为您调用
getAndIncrement(),这有点类似于后增量运算符 (i++)。对于您描述的行为,有incrementAndGet(),它类似于预增量运算符 (++i)。 -
我要问的是“current”是如何作为原语更新的,我只看到“current”所指的值被更新了?
-
我不完全理解您的评论。 Java 是按值传递的,因此
current永远不会被更改,因此在您给定的示例中5将被返回。这能回答你的问题吗? -
啊,我知道了,非常感谢。
标签: java multithreading nonblocking compare-and-swap