我经常遇到我希望问题能像这样解决的情况:
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/