L'unico problema in questo codice che posso vedere è che il campo "cachedConstructor" è volatile, mentre garantisce l'effetto di visibilità del valore tra i thread, questo particolare blocco di codice ha una stranezza che thread diversi potrebbero vedere cachedConstructor come null prima del valore sarà assegnato da uno dei thread, cioè la sequenza di inizializzazione non è atomica. Questo può solo far sì che il CachedConstructor possa essere assegnato un paio di volte simultaneamente, ma non infrangerà il codice se nessuno si affida specificamente che sarà la stessa istanza del Costruttore. Se il blocco di inizializzazione del CachedConstructor fosse sincronizzato, allora sarà atomico, cioè il CachedConstructor assegnato una sola volta indipendentemente dalle condizioni della competizione.
Detto questo, il codice dovrebbe funzionare correttamente, ma consente solo il contemporaneo ricalcolo eccessivo del valore memorizzato nella cache da più di un thread.
fonte
2012-11-01 12:58:15
potresti per favore citare il relativo "codice seguente"? – Vlad
Ho trovato la nota (grazie a google) http://cr.openjdk.java.net/~jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto
tipo di DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011