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

dis*_*ame 2 java integer for-loop atomic infinite-loop

在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么它在这里使用无限循环来设置值?

Tag*_*eev 5

这是CAS循环的经典示例.比较和设置是一个原子操作,它有直接的硬件支持(通常它背后有一些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;
}
Run Code Online (Sandbox Code Playgroud)