我经常遇到这样的情况:如果出现与预期不同的情况,就会触发一个操作。不幸的是,compareAndSet 不适合这种原子问题。我需要类似compareAndSetIfUnequal 的东西。目前我使用类似下面的代码,但恐怕它很昂贵:
private AtomicReference<T> atomic = new AtomicReference<T>(null);
public static void doIfUnequal(T obj) {
if(atomic.getAndSet(obj) != obj) {
doSomething();
}
}
最佳答案
假设您担心示例中重复使用 getAndSet,我首先想提醒您在过分担心之前先对代码进行分析。你的代码很干净。
但是,如果您想避免“set”部分(以及原子操作的相关硬件开销),则需要使用 get 和compareAndSet 自行循环这一部分:
private AtomicReference<T> atomic = new AtomicReference<T>(null);
public static void doIfUnequal(T obj) {
T curVal;
while((curVal = atomic.get()) != obj) {
if(atomic.compareAndSet(curVal, obj)) {
doSomething();
break;
}
}
}
关于java - 是否有 != 值的compareAndSet (compareAndSetIfUnequal)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41074169/