java - 在 AtomicInteger.addAndGet(int) 中使用无限循环

标签 java for-loop integer infinite-loop atomic

在 Java 的包 java.util.concurrent.atomic AtomicInteger 类中有一个方法 addAndGet(int)

这是

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

这里为什么要无限循环设置一个值?

最佳答案

这是 CAS loop 的经典例子. compare-and-set 是一个具有直接硬件支持的原子操作(通常背后有一些 CPU 指令)。它仅在当前值等于预期值时才自动更新给定变量,如果一切成功则返回 true。通常这个循环只执行一次。然而在争用下(当其他线程尝试更新相同的值时)有可能在通过 get() 读取当前值和通过 compareAndSet 更新它之间另一个线程设法更新它.在这种情况下,将重试整个过程直到成功。

在这里使用无限循环只是一种风格问题。它可以使用普通的 do-while 循环重写:

public final int addAndGet(int delta) {
    int current, next;
    do {
        current = get();
        next = current + delta;
    } while (!compareAndSet(current, next));
    return next;
}

关于java - 在 AtomicInteger.addAndGet(int) 中使用无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127768/

相关文章:

java - java连接mysql数据库出错

c - C 中复制 3d 数组的函数?

javascript - 如何按列比较多维数组

c - k&r 示例,温度转换

java - 如何向应用程序上下文注册 bean 集合并使其符合 Autowiring 条件?

java - JFace ColumnWeigthData 导致父级增长

java - 如何使用gradle或maven一次仅对一个模块进行 Sonar 分析?

c# - 与嵌套的 for 循环作斗争

c++ - C++中长整数除法的上限

C 将 char 数组转换为 int 时表现怪异