Come suggerisce il titolo, sto cercando un'implementazione confronto-e-swap, ma con maggiore di confronto:Maggiore di scambio confrontare-e-
if(newValue > oldValue) {
oldValue = newValue;
}
dove oldValue
è un certo stato condiviso globale e newValue
è privato per ogni thread, senza fare questo:
synchronized(locker) {
if(newValue > oldValue) {
oldValue = newValue;
}
}
perché voglio una soluzione non-blocking. Dallo studio codici sorgente di altre operazioni non bloccanti, sono venuto con questa (supponendo che i valori sono numeri interi):
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
}
}
quando // else keep looping
accade, significa che un altro thread ha cambiato il oldValue
nel frattempo quindi ho bisogno di fare un ciclo e riprovare.
Questa implementazione è corretta (thread-safe)?
Questo è solo controllo per vedere se la commutazione discussione si è verificato tra assegnando la variabile 'local' e controllo per vedere se sono uguali La commutazione del thread potrebbe verificarsi dopo l'istruzione if. Quindi no, questo non è thread-safe, ma senza bloccare non sono sicuro se troverai una soluzione. – Shaded
@Shaded: anche la chiamata 'oldValue.compareAndSwap (local, newValue)' restituisce false se il 'oldValue' non è uguale a' local', quindi controlla anche qui. – Tudor
Non è necessario il primo confronto di uguaglianza. Solo "se (newValue> local) oldValue.CAS (local, newValue) else repeat" è sufficiente – BegemoT