class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
Ecco il mio dubbio è secondo a Java concorrenza in pratica se si utilizza volatile, la pubblicazione sicura accade (vale a dire non appena il riferimento è visibile a un altro thread i dati sono anche disponibili). Quindi posso usarlo qui? Ma se è corretto, supponiamo che thread1 ora controlli "resource" ed è null, quindi inizia a creare l'oggetto. Mentre thread1 sta creando l'oggetto di un altro thread, ad esempio thread2, viene e inizia a controllare il valore di "resource" e thread2 lo trova come null (supponiamo che la creazione dell'oggetto "resource" richieda una notevole quantità di tempo e poiché thread1 non ha ancora completato la creazione la pubblicazione sicura non è avvenuta quindi non disponibile per thread2) quindi inizierà anche a creare l'oggetto? se sì, allora le rotture invarianti di classe. Ho ragione? Per favore aiutami a capire questo uso speciale di volatile qui.Singleton con volatili in Java
Non si utilizzerà 'volatile' in un singleton. * Per definizione * l'istanza privata all'interno del singleton non cambierà il che significa che non vi è alcun pericolo che un thread memorizzi un vecchio valore nella cache. Si sta ignorando che al momento hai un'implementazione non a prova di codice perché il tuo 'getInstance' non è sincronizzato. Usa un 'enum' per creare singleton in Java. –
http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html – happybuddha
Per quasi tutti gli usi si potrebbe anche usare l'espressione di inizializzazione mentre il caricamento delle classi viene eseguito pigramente. Se stai usando la classe per qualche altra ragione, forse senza usare questa istanza (che suona male), allora una classe annidata per contenere la statica farà bene il lavoro. –