在java 17中,AtomicReference有类似于compareAndSet的compareAndExchange方法,但它不是返回布尔值,而是在原子操作之前返回值。我需要它来实现自定义并发结构。
由于项目上的限制,我只能使用Java 8特性。一些调查显示,VarHandle拥有compareAndExchange。然而,VarHandle需要Java9。
因此,我似乎必须自己实现compareAndExchange。但是,如何用现有的方法有效地做到这一点呢?(那么compareAndExchangeWeak版本呢?)
(我不能依赖任何第三方图书馆,BTW)
发布于 2022-08-14 06:41:16
这一点很接近,但至少有一种情况有明显的差别:
V witness = ref.get();
if (ref.compareAndSet(oldValue, newValue)) {
return oldValue;
} else {
return witness;
}如果是witness != oldValue,则在进行比较和集合时,witness值不一定是引用的正确值。
但是,还不清楚这个值是否有用.因此,“接近但不完全正确”可能就足够了。使用100%正确的compareAndExchange,返回的witness不会告诉调用者引用的状态是什么。另一个线程可以在调用者尝试使用返回值时更改引用。
例如,这可以返回一个与oldValue匹配的值,而不必执行存储。例如,如果多个线程在具有相同oldValue值的情况下使用相同的witness = oldValue同时运行,则它们都可以加载witness = oldValue,但只有一个线程将继承CAS。因此,您不能安全地使用返回值来确定您的CAS是否“赢得了更新ref的竞赛”。为此,您需要保持从bool返回compareAndSet的值。
我认为如果不使用锁,就不可能对compareAndExchange进行精确的仿真.这将在很大程度上挫败使用AtomicReference的目的。
https://stackoverflow.com/questions/73349502
复制相似问题