In einer schönen article with some concurrency tips wurde ein Beispiel für die folgenden Zeilen optimiert:Unterschied zwischen Synchronisation von Feld liest und flüchtige
double getBalance() {
Account acct = verify(name, password);
synchronized(acct) { return acct.balance; }
}
Wenn ich das richtig verstehe, ist der Punkt der Synchronisation, dass der Wert, um sicherzustellen, ist von acct.balance, die von diesem Thread gelesen werden, ist aktuell und alle ausstehenden Schreibvorgänge in die Felder des Objekts in acct.balance werden ebenfalls in den Hauptspeicher geschrieben.
Das Beispiel ließ mich ein wenig nachdenken: Wäre es nicht effizienter, acct.balance (d. H. Das Feldsaldo der Klasse Account) einfach als volatile
zu deklarieren? Es sollte effizienter sein, speichern Sie alle synchronize
auf Zugriffe auf acct.balance und würde nicht das gesamte Objekt acct
sperren. Fehle ich etwas?
Sie sind richtig, aber der Artikel ist wirklich etwas ganz anderes - lock Umfang zu reduzieren. – gustafc