gpt4 book ai didi

java - Java 8 中 AtomicLong 类中与 CAS 相关的更改如何工作?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:51 26 4
gpt4 key购买 nike

在 Java 8 之前,AtomicLong 类中 CAS 的代码是:

public final long incrementAndGet() {
for (;;) {
long current = get();
long next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

但现在已经改为单一内在行:

public final long incrementAndGet() {
return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;
}

这段代码比前者有什么优势?这个新代码如何工作?

最佳答案

原因是循环上的分支预测。在竞争激烈的情况下,CAS 循环经常失败,分支预测器开始预测执行路径将停留在循环中,从而在 CAS 最终成功时导致大量管道刷新。当你真正想要的是 CAS 失败时的退避,而不是加速时,这也会加速循环。

参见 https://blogs.oracle.com/dave/entry/atomic_fetch_and_add_vs进行更详细的处理。

关于java - Java 8 中 AtomicLong 类中与 CAS 相关的更改如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29249030/

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