Quiero asegurarme de que entiendo correctamente el comportamiento de los objetos 'efectivamente inmutables' de acuerdo con el modelo de memoria de Java.Objeto efectivamente inmutable
Digamos que tenemos una clase mutable, que queremos publicar como una forma efectiva inmutable:
class Outworld {
// This MAY be accessed by multiple threads
public static volatile MutableLong published;
}
// This class is mutable
class MutableLong {
private long value;
public MutableLong(long value) {
this.value = value;
}
public void increment() {
value++;
}
public long get() {
return value;
}
}
hacemos lo siguiente:
// Create a mutable object and modify it
MutableLong val = new MutableLong(1);
val.increment();
val.increment();
// No more modifications
// UPDATED: Let's say for this example we are completely sure
// that no one will ever call increment() since now
// Publish it safely and consider Effectively Immutable
Outworld.published = val;
La pregunta es: ¿Java Memory Model garantiza que todos los hilos DEBEN tener Outworld.published.get() == 3
?
De acuerdo con Java Concurrency In Practice esto debería ser cierto, pero por favor corríjanme si me equivoco.
3.5.3. Lenguajes de publicación seguros
Para publicar un objeto de forma segura, tanto la referencia al objeto como el estado del objeto deben hacerse visibles para otros hilos al mismo tiempo. Un objeto correctamente construido se puede publicar de forma segura por:
- Inicializando una referencia de objeto desde un inicializador estático;
- Almacenar una referencia en un campo volátil o AtomicReference;
- Almacenar una referencia en un campo final de un objeto construido correctamente; o
- Almacenar una referencia en un campo que esté debidamente protegido por un bloqueo.3.5.4. Objetos efectivamente inmutables
Publicación segura Objetos efectivamente inmutables se pueden utilizar de forma segura por cualquier hilo sin sincronización adicional.
Muestre el [* static initializer *] (http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) que establece el estado del objeto antes de que se haga visible su referencia. . – trashgod