大于比较和交换
2022-09-01 20:42:48
正如标题所示,我正在寻找一个比较和交换的实现,但比比较更大:
if(newValue > oldValue) {
oldValue = newValue;
}
其中 是某个全局共享状态,并且是每个线程的私有状态,而不这样做:oldValue
newValue
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 looping
oldValue
此实现是否正确(线程安全)?