java synchronisierte Methode - wie funktioniert es

7

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

    
Matthew Smith 09.01.2013, 18:17
quelle

4 Antworten

15
  

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:

  • Atomarität, die für eine Ein-Zeilen-Zuweisung nicht nützlich ist (außer im Grenzfall unten)
  • Sichtbarkeit
  • verhindert Neuanordnungen
  • wechselseitiger Ausschluss: 2 Methoden, die auf demselben Monitor synchronisiert sind, können nicht gleichzeitig ausgeführt werden

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%     
assylias 09.01.2013, 18:20
quelle
2

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.

    
Denys Séguret 09.01.2013 18:19
quelle
1

Die synchronisierte Methode macht zwei Dinge:

  • Erlaubt nicht mehr als 1 Thread, um diese Methode auszuführen
  • Synchronisiert den Thread-Speicher-Cache mit dem gemeinsamen Speicher.

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.

    
Tom 09.01.2013 18:22
quelle
0

mehrere Threads könnten die setValue-Methode mit einem anderen Wert aufrufen. Wenn Sie also wirklich sicherstellen wollen, dass eine Thread-Änderung für einen anderen Thread sichtbar ist, sollte die Methode synchronisiert werden.

    
ssk 09.01.2013 18:21
quelle

Tags und Links