Больше, чем сравнение и замена

Как видно из названия, я ищу реализацию сравнения и замены, но с большим, чем сравнение:

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 , поэтому мне нужно зациклить и повторить попытку.

Правильная ли эта реализация (потокобезопасная)?

16
задан Vadzim 18 July 2017 в 10:42
поделиться