como sugiere el título, estoy buscando una aplicación de comparación y de intercambio, pero con mayor que la comparación:mayores a las de intercambio de comparación y
if(newValue > oldValue) {
oldValue = newValue;
}
donde oldValue
es un estado global compartida y newValue
es privado para cada hilo, sin hacer esto:
synchronized(locker) {
if(newValue > oldValue) {
oldValue = newValue;
}
}
porque quiero una solución no bloqueante. Del estudio de los códigos fuente de las demás operaciones no bloqueantes, yo he llegado con esto (suponiendo que los valores son números enteros):
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
}
}
cuando // else keep looping
sucede, significa que otro hilo ha cambiado la oldValue
en el ínterin y entonces necesito repetir y volver a intentarlo
¿Es correcta esta implementación (sin hilos)?
Esto sólo está comprobando para ver si la conmutación de hilo se produjo entre la asignación de la variable 'local' y la comprobación para ver si son lo mismo La conmutación de subprocesos podría ocurrir después de su declaración if. Así que no, esto no es seguro para subprocesos, pero sin bloquear no estoy seguro de si encontrará una solución. – Shaded
@Shaded: la llamada 'oldValue.compareAndSwap (localValue)' también devuelve falso si 'oldValue' no es igual a' local', por lo que también se comprueba aquí. – Tudor
No necesita comparar primero la igualdad. Solo "if (newValue> local) oldValue.CAS (local, newValue) else repeat" es suficiente – BegemoT