Warum ist java.lang.Class.newInstance0 () nicht strikt unter dem Java-Speichermodell zu korrigieren?

8

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?

    
SpaceTrucker 01.11.2012, 12:40
quelle

2 Antworten

5

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.

    
Ievgen Lukash 01.11.2012, 12:58
quelle
1
  

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.

    
irreputable 01.11.2012 17:36
quelle

Tags und Links