Desidero assicurarmi di comprendere correttamente il comportamento degli 'oggetti efficacemente immutabili' in base al modello di memoria Java.Oggetto effettivamente immutabile
Diciamo che abbiamo una classe mutevole, che vogliamo pubblicare come un efficace immutabile:
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;
}
}
Abbiamo effettuare le seguenti operazioni:
// 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 domanda è: Il modello di memoria Java garantisce che tutte le discussioni DEVONO avere Outworld.published.get() == 3
?
Secondo Java Concurrency In Practice questo dovrebbe essere vero, ma per favore correggimi se sbaglio.
3.5.3. Idiomi di pubblicazione sicuri
Per pubblicare un oggetto in modo sicuro, sia il riferimento all'oggetto che lo stato dell'oggetto devono essere resi visibili ad altri thread contemporaneamente. Un oggetto correttamente costruito può essere tranquillamente pubblicato da:
- Inizializzazione di un riferimento a un oggetto da un inizializzatore statico;
- Memorizzare un riferimento ad esso in un campo volatile o AtomicReference;
- Memorizzare un riferimento ad esso in un campo finale di un oggetto costruito correttamente; oppure
- Memorizzare un riferimento ad esso in un campo adeguatamente protetto da un lucchetto.3.5.4. Oggetti efficacemente immutabili
Gli oggetti effettivamente immutabili, pubblicati con sicurezza, possono essere utilizzati in modo sicuro tramite qualsiasi thread senza sincronizzazione aggiuntiva.
Si prega di mostrare [* static initializer *] (http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) che stabilisce lo stato dell'oggetto prima che un riferimento ad esso sia reso visibile . – trashgod