Ich habe den Quellcode des JDK über ConcurrentHashMap gelesen.
Aber der folgende Code hat mich verwirrt:
public boolean isEmpty() {
final Segment<K,V>[] segments = this.segments;
...
}
Meine Frage ist:
"this.segments" wird deklariert:
final Segment<K,V>[] segments;
Zeigen Sie hier zu Beginn der Methode, die dieselbe Typreferenz deklariert hat, auf denselben Speicher.
Warum hat der Autor es so geschrieben? Warum haben sie this.segments nicht direkt verwendet? Gibt es einen Grund?
this.segments
Inhalt ändert , sehen Sie diese Änderung nicht in Ihremsegments
?segments
, werden Sie offensichtlich davon isoliert sein.Ich denke, es ist aus Gründen der Leistung, so dass wir den Feldwert nur einmal abrufen müssen.
Sie können sich auf eine Singleton-Sprache aus dem effektiven Java von Joshua Bloch beziehen
Sein Singleton ist hier:
private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { synchronized(this) { result = field; if (result == null) field = result = computeFieldValue(); } } return result; }
und er schrieb:
quelle
Dies kann die Größe des Bytecodes verringern. Der Zugriff auf eine lokale Variable ist im Bytecode kürzer als der Zugriff auf eine Instanzvariable.
Der Aufwand für die Laufzeitoptimierung kann ebenfalls reduziert werden.
Aber keines davon ist von Bedeutung. Es geht mehr um den Codestil. Wenn Sie sich mit Instanzvariablen auf jeden Fall wohl fühlen. Doug Lea fühlt sich wahrscheinlich wohler im Umgang mit lokalen Variablen.
quelle