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