java - 为什么在 Java 中可以在没有竞争条件的情况下并发更新原子变量?

标签 java multithreading atomic

下面的代码在没有竞争条件的情况下工作

AtomicInteger atomicInt = new AtomicInteger(0);

ExecutorService executor = Executors.newFixedThreadPool(20);

IntStream.range(0, 1000)
    .forEach(i -> executor.submit(atomicInt::incrementAndGet));

这里是incrementAndGet的实现

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

我们可以看到 current 没有同步或锁定,在一个线程获得 current 之后,另一个线程可能已经更新了 current

但原子类似乎以某种方式避免了竞争条件。

谁能指出我的错误?

最佳答案

compareAndSet 设置值(并返回 true)当且仅当第一个参数等于 AtomicInteger 的当前值时。

也就是说,如果另一个线程已经更改了该值,则 current 将不等于当前值,循环将再次运行。

来自documentation compareAndSet(int expect, int update):

Atomically sets the value to the given updated value if the current value == the expected value.

关于java - 为什么在 Java 中可以在没有竞争条件的情况下并发更新原子变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802457/

相关文章:

java - 将现有的 android studio 项目与 libgdx 项目合并

java - 代号一张 map

java - 使用 batik 向 DOM 文档添加元素

java - 为什么 boolean 标志不能同时用作 wait()/notifyAll() 互斥量?

java - 何时使用HandlerThread、何时设置new Looper

java - 如何在java中使用正则表达式在给定单词之后提取java中的单词

c# - .NET 服务是否表现出线程敏捷性?

c - 实现临界区

Javascript原子系列操作

c++ - 与普通变量相比,仅读取原子变量是否有性能差异?