gpt4 book ai didi

java.util.concurrent 代码审查

转载 作者:搜寻专家 更新时间:2023-11-01 01:05:36 24 4
gpt4 key购买 nike

我正在研究 java.util.concurrent 库并在源代码中发现许多无限循环,就像这个

//java.util.concurrent.atomic.AtomicInteger by Doug Lea
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}

我想知道,在什么情况下实际值不能等于预期值(在这种情况下 compareAndSet 返回 false)?

最佳答案

许多现代 CPU 都有 compareAndSet() 映射到原子硬件操作。这意味着它是线程安全的,不需要同步(相比之下这是一个相对昂贵的操作)。然而,它只是 compareAndSet() 本身是原子的,所以为了 getAndSet()(即将变量设置为给定值并返回它当时的值时间,不可能在两者之间将它设置为不同的值)代码使用了一个技巧:首先它获取值,然后它尝试 compareAndSet() 它刚刚获得的值和新的值(value)。如果失败,则该变量被中间的另一个线程操作,代码会再次尝试。

如果 compareAndSet() 很少失败,即如果没有太多线程同时写入变量,这比使用同步要快。在许多线程一直写入变量的极端情况下,同步实际上可以更快,因为虽然有同步开销,但其他试图访问变量的线程将等待并在轮到它们时被唤醒,而不是必须反复重试该操作。

关于java.util.concurrent 代码审查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913292/

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