atomicinteger - ¿Cuándo usar AtomicReference(Java)? ¿Es realmente necesario?
atomicinteger java (1)
Es una referencia , entonces eso es lo que se compara. La documentación deja muy claro que se trata de una comparación de identidad, incluso utilizando la operación ==
en su descripción.
Uso AtomicReference
y otras clases atómicas con mucha frecuencia. La creación de perfiles muestra que funcionan mejor que los métodos equivalentes mediante la sincronización. Por ejemplo, una operación get()
en una AtomicReference
solo requiere una recuperación de la memoria principal, mientras que una operación similar que utiliza synchronized
debe enjuagar primero los valores almacenados en caché por subprocesos en la memoria principal y luego realizar su recuperación.
Las clases de AtomicXXX
proporcionan acceso a soporte nativo para operaciones de comparación e intercambio (CAS). Si el sistema subyacente lo admite, CAS será más rápido que cualquier esquema preparado con bloques synchronized
en Java puro.
He usado AtomicLong muchas veces pero nunca he necesitado utilizar AtomicReference
Parece que AtomicReference lo hace (copié este código de otra pregunta de stackoverflow):
public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) {
if (this.someList == oldValue) {
// someList could be changed by another thread after that compare,
// and before this set
this.someList = newValue;
return true;
}
return false;
}
O
public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) {
if (this.someList == oldValue || this.someList.equals(oldValue)) {
// someList could be changed by another thread after that compare,
// and before this set
this.someList = newValue;
return true;
}
return false;
}
Suponga que this.someList está marcado como volátil.
No estoy seguro de cuál es realmente porque el javadoc y el código para esa clase no están claros si se usa .equals.
Al ver cómo los métodos anteriores no son tan difíciles de escribir, ¿alguna vez alguien ha utilizado AtomicReference?