正如標題所暗示的,我正在尋找一個比較並交換實現,但大於比較:大於比較並交換
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