Kosten für die Verwendung der endgültigen Felder

Wir wissen, dass das Finalisieren von Feldern normalerweise eine gute Idee ist, da wir Thread-Sicherheit und Unveränderlichkeit erlangen, was es einfacher macht, über den Code nachzudenken. Ich bin gespannt, ob damit Performancekosten verbunden sind.

Das Java Memory Model garantiert diesfinal Field Semantics:

Ein Thread, der nur einen Verweis auf ein Objekt sehen kann, nachdem dieses Objekt vollständig initialisiert wurde, wird garantiert, dass die korrekt initialisierten Werte für die endgültigen Felder dieses Objekts angezeigt werden.

Dies bedeutet, dass für eine Klasse wie diese

class X {
    X(int a) {
        this.a = a;
    }
    final int a;

    static X instance;
}   

wann immer Thread 1 eine Instanz wie diese erstellt

X.instance = new X(43);
while (true) doSomethingEventuallyEvictingCache();

und Thread 2 sieht es

 while (X.instance == null) {
      doSomethingEventuallyEvictingCache();
 }
 System.out.println(X.instance.a);

es muss 43 drucken. Ohne diefinal Modifikator, JIT oder CPU könnten die Filialen neu anordnen (erste Filiale)X.instance und dann einstellena=43) und Thread 2 konnten den voreingestellten Wert sehen und stattdessen 0 ausgeben.

Wenn JIT siehtfinal es sieht offensichtlich von einer Neuordnung ab. Es muss aber auch die CPU dazu zwingen, der Anweisung Folge zu leisten. Gibt es eine damit verbundene Leistungsminderung?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage