【发布时间】:2022-10-01 09:37:52
【问题描述】:
研究原子类我发现了这段代码:
public class AtomicCounter {
private AtomicLong count = new AtomicLong(0);
public void increment() {
boolean updated = false;
while(!updated){
long prevCount = count.get();
updated = count.compareAndSet(prevCount, prevCount + 1);
}
}
public long count() {
return count.get();
}
我问自己如果发生以下情况怎么办:
-
在线程 A 中,在调用
compareAndSet方法后,布尔值更新为 true。 -
在线程 B 中,指令
boolean updated = false;被执行,并且更新的布尔值再次更改为 false -
在线程 A 中,循环 while 检查最近更改为 false 的布尔值更新的值,因此将发生另一个飞跃。
在这种情况下,即使线程 A 已经将 updated 的值更改为 true ,线程 A 也会进行新的飞跃,因为在此更改和检查更新的时间之间,另一个线程 B 已将更新的值更改为错误的。 这种情况在多大程度上是真实的?
-
我格式化了你的编号。 Stack Overflow 确实通过其 Markdown 风格支持基本的 HTML。我建议您在有用的地方利用它。
-
线程共享
AtomicCounter,因此它们也会共享它的count变量。updated是本地的意味着它只存在于方法当前执行的上下文中。即使在同一个线程中递归调用该方法,每次都会有一个新的本地版本。如果你递归太深,你会得到一个stackoverflow,因为它们太多了,无法放入内存(或者确切地说是堆栈)。
标签: java multithreading