正如标题所暗示的,我正在寻找一个比较并交换实现,但大于比较:大于比较并交换
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
在此期间和所以我需要循环并重试。
此实现是否正确(线程安全)?
这只是检查是否分配'local'变量和检查,看看之间发生线程切换如果他们是一样的。线程切换可能发生在if语句之后。所以不,这不是线程安全的,但没有阻止我不确定你是否会找到解决方案。 – Shaded 2012-02-20 15:20:24
@Shaded:如果'oldValue'不等于'local','oldValue.compareAndSwap(local,newValue)'调用也会返回false,所以它也会在这里检查。 – Tudor 2012-02-20 15:22:17
你不需要第一次平等comparizon。只是“如果(newValue> local)oldValue.CAS(local,newValue)else repeat”就足够了 – BegemoT 2012-02-20 15:23:07