gpt4 book ai didi

java - 为什么 AtomicInteger 和类似类的 getAndSet() 中存在循环?

转载 作者:IT老高 更新时间:2023-10-28 21:01:32 31 4
gpt4 key购买 nike

在这段代码中使用循环的目的是什么

public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}

最佳答案

有一种观点认为你应该use locks as frugally as you can . IE。如果可以避免,切勿使用锁,如果必须使用,请锁定最短时间。这背后的原因是,有时首先获取锁定的成本相当高,以及一个线程等待而另一个线程持有它所需资源的锁定的成本。

有一个 very long time , cpu 指令称为 Compare and Set (或 CAS 简称) 旨在帮助解决这个问题:

if (value == providedValue) {
value = newValue;
return true;
} else {
return false;
}

这些指令可以在机器代码级别执行,并且比创建锁要快得多。

想象一下,您想使用这些指令之一将 1 添加到一个数字上,这种方式在高并行负载下始终能正常工作。显然,您可以将其编码为:

int old = value;
if ( compareAndSet(old, old+1) ) {
// It worked!
} else {
// Some other thread incremented it before I got there.
}

但是如果 CAS 失败了怎么办?你猜对了 - 再试一次!

boolean succeeded = false;
do {
int old = value;
if ( compareAndSet(old, old+1) ) {
// It worked!
succeeded = true;
} else {
// Some other thread incremented it before I got there. Just try again.
}
} while (!succeeded);

你会看到你观察到的模式。

使用这个和类似的习惯用法,可以实现许多功能,甚至是一些非常复杂的数据结构,完全不使用锁(通常称为无锁)。例如,hereRing Buffer 的无锁实现.

关于java - 为什么 AtomicInteger 和类似类的 getAndSet() 中存在循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077080/

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