Diese Frage ist etwas Fortsetzung und Erweiterung dieser, wie ich glaube, perfekt Frage: How does assigning to a local variable help here?Zugriff auf flüchtige Felder durch lokale Variablen
diese Frage basiert auf Item 71
von Effective Java
, wo es wird vorgeschlagen, die Leistung zu beschleunigen durch lokalen Variable in Zweck volatile
Feldzugriff Einführung:
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
So meine Frage ist häufiger:
sollten wir immer Zugriff auf volatile
Felder durch Zuordnung ihrer Werte zu lokalen Variablen?(um die beste Leistung zu archivieren).
I.e. einige Idiom:
haben wir einige
volatile
Feld, nennen es nurvolatileField
;wenn wir seinen Wert lesen wollen in Multi-Thread-Methode, wir sollten:
- lokalen Variable mit dem gleichen Typ erstellen:
localVolatileVariable
- assign Wert von flüchtigem Feld:
localVolatileVariable = volatileField
Lese Wert aus diesem lokalen Kopie, zB:
if (localVolatileVariable != null) { ... }
- lokalen Variable mit dem gleichen Typ erstellen:
Wie unterscheidet sich diese Frage von der, auf die Sie verlinken? Es scheint, dass Sie eine Antwort auf eine Situation haben möchten, die breiter ist als das Szenario "lazy-loaded Field initialisieren" des dort gezeigten Codes (und hier). Aber dann kann die Antwort nicht mehr sein als "es kommt darauf an", fürchte ich. – Thilo
Es ist anders, dass ich nur verstehen will: ist diese Optimierung nur für den speziellen Fall anwendbar, der in "Item 71" beschrieben wird, oder ist es ein gewöhnlicher Ansatz für das Lesen von "flüchtigen" Feldern? – Andremoniy