是否有!= value的compareAndSet(compareAndSetIfUnequal)?

时间:2016-12-10 09:45:37

标签: java multithreading concurrency

我常常遇到的情况是,如果某些事情与预期不同,就会触发某个动作。不幸的是compareAndSet不适合这种原子问题。我需要像compareAndSetIfUnequal这样的东西。目前我使用类似下面的代码,但我担心它很昂贵:

private AtomicReference<T> atomic = new AtomicReference<T>(null);
public static void doIfUnequal(T obj) {                  
    if(atomic.getAndSet(obj) != obj) {
       doSomething();
    }
}

1 个答案:

答案 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;
        }
    }
}