Как видно из названия, я ищу реализацию сравнения и замены, но с большим, чем сравнение:
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
}
}
когда происходит // иначе продолжается цикл
, это означает, что другой поток изменился тем временем oldValue
, поэтому мне нужно зациклить и повторить попытку.
Правильная ли эта реализация (потокобезопасная)?