La lectura de este DZone article sobre la concurrencia de Java Me preguntaba si el siguiente código:Java volátil pregunta variables
private volatile List list;
private final Lock lock = new ReentrantLock();
public void update(List newList) {
ImmutableList l = new ImmutableList().addAll(newList);
lock.lock();
list = l;
lock.unlock();
}
public List get() {
return list;
}
es equivalente a:
private volatile List list;
public void update(List newList) {
ImmutableList l = new ImmutableList().addAll(newList);
list = l;
}
public List get() {
return list;
}
El try {} finally {} bloque se omitió para brevedad. Supongo que la clase ImmutableList es una estructura de datos verdaderamente inmutable que contiene sus propios datos, como el proporcionado en la biblioteca de google-collections. Dado que la variable de la lista es volátil y, básicamente, lo que está sucediendo es una copia al vuelo, ¿no es seguro omitir el uso de bloqueos?
Creo que ambos deben comportarse exactamente lo mismo, pero depende de la aplicación de la 'ImmutableList'. Me esperaba que al llamar 'addAll()' en una 'ImmutableList' lanzaría una excepción, por lo que nunca se usaría el bloqueo. –