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