首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8推动比较和交换(而不是比较和设置!)

Java 8推动比较和交换(而不是比较和设置!)
EN

Stack Overflow用户
提问于 2022-08-14 06:19:44
回答 1查看 98关注 0票数 1

在java 17中,AtomicReference有类似于compareAndSetcompareAndExchange方法,但它不是返回布尔值,而是在原子操作之前返回值。我需要它来实现自定义并发结构。

由于项目上的限制,我只能使用Java 8特性。一些调查显示,VarHandle拥有compareAndExchange。然而,VarHandle需要Java9。

因此,我似乎必须自己实现compareAndExchange。但是,如何用现有的方法有效地做到这一点呢?(那么compareAndExchangeWeak版本呢?)

(我不能依赖任何第三方图书馆,BTW)

EN

回答 1

Stack Overflow用户

发布于 2022-08-14 06:41:16

这一点很接近,但至少有一种情况有明显的差别:

代码语言:javascript
复制
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的目的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73349502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档