Ich denke, ich weiß das, aber ich möchte es bestätigen.
Offensichtlich blockiert das synchronisierte andere Threads davon, aber ich sehe und schrecklich viele Beispiele wie
%Vor%Habe ich richtig gedacht, dass, wenn die Methode nur eine Zeile wie die obige ausführt, es keinen Sinn hat, sie zu synchronisieren.
Danke
Habe ich richtig gedacht, dass, wenn die Methode nur eine Zeile wie die obige ausführt, es keinen Sinn hat, sie zu synchronisieren.
Nein. Sie scheinen zu glauben, dass synchronisiert nur Atomizität bedeutet.
Aber es bietet tatsächlich mehr als das - insbesondere garantiert es:
In Ihrem Beispiel, ohne synchronisiert, haben Sie keine Garantie, dass, wenn ein Thread Ihre Methode aufruft und eine andere balance
liest, dieser zweite Thread den aktualisierten Wert sehen wird.
Beachten Sie, dass die Sichtbarkeit an beiden Enden gewährleistet sein muss: das Schreiben UND das Lesen müssen mit demselben Monitor synchronisiert werden. Also muss der Getter getBalance
ebenfalls synchronisiert werden.
Grenzfall : doppelt und lange Aufgaben sind nicht garantiert atomar . Selbst bei einem Ein-Zeilen-Beispiel wie unten, ohne das synchronisierte Schlüsselwort, wäre es möglich, dass ein Thread die ersten 32 Bits des Double aktualisiert und ein anderer Thread die letzten 32 Bits aktualisiert, wodurch eine neue Balance-Variable entsteht.
%Vor%Es blockiert nicht nur andere Threads, die auf diese Methode zugreifen: Es blockiert andere Threads, die auf einen Block oder eine Methode mit derselben Sperre (hier die Instanz) zugreifen.
Der Punkt ist, dass, wenn eine andere synchronisierte Methode länger ist, Sie sicher sein werden, dass diese nicht gleichzeitig ausgeführt wird.
Dies ist wichtig, wenn die andere Methode davon abhängig ist, dass sich die Variable balance
während ihrer Ausführung nicht ändert.
Die synchronisierte Methode macht zwei Dinge:
In Ihrem Fall kann nur ein Thread diese Variable aktualisieren und auch alle anderen Threads sehen in der Variable balance
aktuelle Daten.
Ohne Synchronisation würde ein anderer Thread den Cache-Wert von balance
verwenden (das ist sehr wahrscheinlich), so dass Sie nach der Programmausführung inkonsistenten balance
-Wert erhalten würden.
In dieser Präsentation finden Sie eine sehr schöne Erläuterung Ihres Problems.
Tags und Links java synchronized