我常常遇到的情况是,如果某些事情与预期不同,就会触发某个动作。不幸的是compareAndSet不适合这种原子问题。我需要像compareAndSetIfUnequal这样的东西。目前我使用类似下面的代码,但我担心它很昂贵:
private AtomicReference<T> atomic = new AtomicReference<T>(null);
public static void doIfUnequal(T obj) {
if(atomic.getAndSet(obj) != obj) {
doSomething();
}
}
答案 0 :(得分:1)
假设您担心在示例中重复使用getAndSet,我首先要提醒您在对代码进行过多担忧之前对代码进行分析。你的代码很干净。
但是,如果你想避免“set”部分(以及原子操作的相关硬件开销),你需要使用get with 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;
}
}
}