gpt4 book ai didi

java - AtomicInteger 类中 addAndGet 的实现

转载 作者:搜寻专家 更新时间:2023-11-01 01:27:00 25 4
gpt4 key购买 nike

我正在查看 AtomicInteger 类中 addAndGet 方法的 Java(Java 6) 源代码。

对应的代码如下:

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

compareAndSet 方法调用本地方法来执行赋值。主要有两个问题:

  1. 无限循环有何帮助?
  2. 在什么情况下,“如果(compareAndSet(current, next))” 条件可能返回 false ?在在这种情况下,代码可能会陷入无限循环。如果是保证 compareAndSet 将始终返回“true”,然后可以我们不会完全取消这张支票吗?

类似的疑惑还有decrementAndGetgetAndDecrementgetAndAdd方法。

最佳答案

How does the infinite loop help ?

这意味着:重试直到成功。如果没有循环,第一次可能不会成功(见下文)。

What could be the scenarios, under which the "if (compareAndSet(current, next))" condition could return a false ?

如果两个线程试图同时修改值,就会发生这种情况。其中一个将首先到达那里。另一个会失败。

想象一下两个线程(A 和 B)试图从 5 增加到 6

A: int current = get();  // current = 5
B: int current = get(); // current = 5
B: int next = current + delta; // next = 6
B: if (compareAndSet(current, next)) // OK
return next;
A: int next = current + delta; // next = 6
A: if (compareAndSet(current, next))
// fails, because "current" is still 5
// and that does not match the value which has been changed to 6 by B

请注意,该类的重点是避免锁定。因此,相反,您拥有这种“乐观的货币控制”:假设没有其他人同时处理数据,如果事实证明这是错误的,则回滚并重试。

In such a case, the code might run into an infinite loop

不是真的。对于对值执行某些操作的每个其他线程,它只能失败一次。

第二次迭代中的线程 A:

A: int current = get();  => current now 6
A: int next = current + delta; => next = 7
A: if (compareAndSet(current, next)) => now OK

如果其他线程不断更新该值,您可能会以一个线程永远等待而告终,但仅此而已。为避免这种情况,您需要一些“公平”的定义(并发包中的其他一些工具支持)。

关于java - AtomicInteger 类中 addAndGet 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17691983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com