java - 是否有 != 值的compareAndSet (compareAndSetIfUnequal)?

标签 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();
    }
}

最佳答案

假设您担心示例中重复使用 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/

相关文章:

java - moveTo() 方法中的VerifyException

java - 线程执行时停止循环执行

c# - 什么情况下 ConcurrentBag.TryTake() 会失败?

c# - 支持移除项的线程安全集合

java - 如何使 JTable 单元格默认为覆盖模式

java - 从 JUnit 测试用例调用部署在远程服务器中的 Camel 端点

java - Camel-salesforce-maven-plugin 生成无法编译的代码

c# - 多线程会提高单处理器的计算速度吗

python - 如何在 Flask 路由中使用线程

c++ - 英特尔线程构建 block 并发队列 : Using pop() over pop_if_present()