大于比较和交换
2022-09-01 20:42:48
						正如标题所示,我正在寻找一个比较和交换的实现,但比比较更大:
if(newValue > oldValue) {
    oldValue = newValue;
}
其中 是某个全局共享状态,并且是每个线程的私有状态,而不这样做:oldValuenewValue
synchronized(locker) {
    if(newValue > oldValue) {
        oldValue = newValue;
    }       
}
因为我想要一个非阻塞解决方案。通过研究其他非阻塞操作的源代码,我得出了这个(假设值是整数):
AtomicInteger oldValue; // shared global variable
...
public boolean GreaterThanCAS(int newValue) {
    while(true) {
        int local = oldValue;
        if(local == oldValue) {
            if(newValue > local) {
                 if(oldValue.compareAndSet(local, newValue) {
                     return true;  // swap successful
                 } // else keep looping
            } else {
                 return false; // swap failed
            }
        } // else keep looping
    }
}
当发生时,这意味着另一个线程在此期间更改了,所以我需要循环并重试。// else keep loopingoldValue
此实现是否正确(线程安全)?