2010-10-19 11 views
5

In un ambiente a più thread, come può un thread visualizzare un "oggetto parzialmente costruito"? Ho capito che non è thread-safe poiché più thread possono creare più istanze.Oggetti parzialmente costruiti in modalità non thread Singleton

class LazyInit 
{ private static Resource resource = null; 

    public static getInstance() 
    { if (resource == null) { resource = new Resource(); } 
     return instance; 
    } 
} 
+1

Vedere https://secure.wikimedia.org/wikipedia/en/wiki/Double-checked_locking – Bozho

risposta

7

A causa di scritture fuori servizio.

Se il costruttore scrive su membri non finali, non è necessario eseguire il commit alla memoria immediatamente, e in realtà possono anche essere impegnati dopo la variabile Singleton. Java garantisce che il thread che lo riguarda vede le affettazioni in ordine, ma non gli altri thread se non si mette una barriera di memoria.
Vedere this question e this page delle specifiche Java per ulteriori informazioni.

Potrebbe essere accanto al punto ma nel tuo esempio, è del tutto possibile che due thread vedano diversi singleton. Supponiamo che un thread verifichi la nullità della variabile, entri nello if e venga preventivamente disattivato prima che abbia la possibilità di costruire l'oggetto. Il nuovo thread che ottiene la CPU ora testa l'oggetto ancora null, costruisce il singleton. Quando il thread vecchio inizia a funzionare nuovamente terminerà felicemente la costruzione dell'oggetto e sovrascriverà la variabile Singleton.
Un altro problema, più spaventoso, si verifica se il costruttore di Risorsa richiede un metodo che alla fine si tradurrà in un'altra chiamata a getInstance. Anche se lo stato del programma non produce un loop infinito, creerai diverse istanze Singleton.

Problemi correlati