java - CAS 和非阻塞计数器

标签 java concurrency

我一直在阅读 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/

相关文章:

c# - C# 中的条件线程锁

java - 等待所有任务完成

java - 如何使用 apache POI 复制包含图表的幻灯片?

java - 使用@Autowired时创建带有名称的bean时出错

java - 使用混合类型时编码 XML 没有子级

java - Eclipse加载框弹出然后很快消失,为什么不加载?

java - Java 中的信号量。为什么第二个线程不等待?

java - 如何将Java项目从jar导入到eclipse中?

Java:执行器与队列的关系

java - 避免返回 LIST 时可能出现的并发问题