Voglio capire se volatile
è necessario per pubblicare oggetti immutabili.Pubblicazione sicura di oggetti immutabili in Java
Ad esempio, supponendo abbiamo un oggetto immutabile A
:
// class A is immutable
class A {
final int field1;
final int field2;
public A(int f1, int f2) {
field1 = f1;
field2 = f2;
}
}
allora abbiamo una classe B
cui si accede da diversi thread. Esso contiene un riferimento a un oggetto della classe A
:
// class B publishes object of class A through a public filed
class B {
private /* volatile? */ A toShare;
// this getter might be called from different threads
public A getA(){
return toShare;
}
// this might be called from different threads
public void setA(num1, num2) {
toShare = new A(num1, num2);
}
}
Dalla mia lettura sembra oggetti immutabili possono essere pubblicati in modo sicuro attraverso qualunque mezzo , quindi vuol dire che non abbiamo bisogno di dichiarare toShare
come volatile
a garantire la sua visibilità della memoria?
Se uno qualsiasi thread è in grado di recuperare un riferimento all'oggetto 'A' attraverso' toShare', che 'è garantito oggetto A' di essere pienamente inizializzato. – Savior
Ma quello che ha recuperato 'A' è il valore più aggiornato? Poiché altri thread potrebbero aggiornare 'toShare' tramite il metodo' setA'. JVM garantisce che il valore aggiornato non verrà memorizzato nella cache localmente nel thread di impostazione? – aha