java - "Ternary CAS operation"理论上可能吗?

标签 java multithreading compare-and-swap

我经常遇到我希望问题能像这样解决的情况:

AtomicBoolean bool1 = new AtomicBoolean();
AtomicBoolean bool2 = new AtomicBoolean();

boolean expected = false; // whatever
boolean update = false; // whatever

if(bool1.get()) {
    bool2.compareSet(expected, update);
}

但这不起作用,因为可以在 bool1.get()bool2.compareSet(...) 之间进行上下文切换。所以需要的是我称之为“三元原子 boolean 值”的东西,它可以做 bool1.get()bool2.compareSet(...)在一次 CAS 操作中。

我的问题是是否可以做到。有没有人知道有人也在考虑这个问题(一些大学)或者有没有人知道现有的解决方案接近所需的解决方案(我的意思是没有锁,同步块(synchronized block),互斥锁,信号灯,但使用 CAS仅基于算法)。

最佳答案

使用 AtomicInteger,它也有一个 CompareSet 方法,并将您的 boolean 值建模为位域。您可以在一个整数中建模 32 个 boolean 值。

关于java - "Ternary CAS operation"理论上可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580245/

相关文章:

c++ - 如果不相等,比较和交换后返回对象?

java - CountedCompleter类中 "private static final VarHandle PENDING"的作用是什么

c - 普通 int 上的 stdatomic.h 函数 - 产生未定义或实现定义的行为?

java - 将 servlet 响应的响应传递回先前的 jsp 页面

java - null是java中的一个类吗?

java - 具有不断变化的接口(interface)的装饰器模式

java - 在Java中,我想调用名称为 'foo' 的对象的方法,但 'foo' 是一个字符串。我该如何解决这个问题?

java - 使用 Executors.newSingleThreadExecutor() 的优势

c - Posix named lock inter process 什么与多线程应用程序一起工作?

linux - 如何在较新的 Linux 内核中查找堆栈内存段