我一直在阅读 Brian Goetz 的 JCIP。他解释了使用 CAS 指令实现非阻塞计数器。我无法理解增量是如何使用 CAS 指令发生的。任何人都可以帮助我理解这一点。
public class CasCounter {
private SimulatedCAS value;
public int getValue() {
return value.get();
}
public int increment() {
int v;
do {
v = value.get();
}
while (v != value.compareAndSwap(v, v + 1));
return v + 1;
}
}
最佳答案
value.compareAndSwap(v, v + 1)
等效于以下内容,除了整个 block 是原子的:(有关详细信息,请参阅 compare-and-swap)
int old = value.val;
if (old == v) {
value.val = v + 1;
}
return old;
现在 v = value.get()
获取计数器的当前值,如果没有其他人同时尝试更新计数器,old == v
将为真,因此该值设置为 v+1
(即递增)并返回 old
。自 v == old
以来,循环终止。
假设其他人在我们执行 v = value.get()
之后增加了计数器,那么 old == v
将为 false,并且该方法将立即返回old
,这是更新后的值。由于 v != old
现在,循环继续。
关于java - CAS 和非阻塞计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220519/