Ich habe den folgenden Hinweis in java.lang.Class.newInstance0()
in JDK 1.7 Update 7:
Hinweis: der folgende Code ist möglicherweise nicht strikt korrekt unter dem aktuellen Java-Speichermodell.
Kann jemand bitte erklären warum?
Das einzige Problem in diesem Code, das ich sehen kann, ist, dass "cachedConstructor" Feld ist flüchtig, während es Wert Sichtbarkeit Effekt unter Threads garantiert, dieser bestimmte Code-Block haben eine Eigenart, dass verschiedene Threads cachedConstructor als Null vor dem Wert sehen könnte durch einen der Threads zugewiesen werden, dh die Initialisierungssequenz ist nicht atomar. Dies kann nur dazu führen, dass cachedConstructor mehrere Male gleichzeitig zugewiesen wird, aber den Code nicht bricht, wenn niemand explizit darauf vertraut, dass es sich um dieselbe Konstruktorinstanz handelt. Wenn der CachedConstructor-Initialisierungsblock synchronisiert würde, wäre er atomar, d. H. CachedConstructor wird nur einmal unabhängig von der Race-Bedingung zugewiesen.
Das heißt, Code sollte richtig funktionieren, erlaubt aber gleichzeitig eine übermäßige Neuberechnung des zwischengespeicherten Wertes um mehr als einen Thread.
das aktuelle Java-Speichermodell
Die Frage ist "wie aktuell".
Dieser Teil des Codes ist wahrscheinlich sehr alt, 1.4 oder früher, und niemand hat ihn seither berührt.
Dem Autor war wahrscheinlich bewusst, dass an einem neuen Speichermodell gearbeitet wurde.
Tags und Links java memory-model