Beziehung zwischen Threads und println () Anweisungen

8

Ich habe versucht, ein paar Szenarien zu erstellen, um Sichtbarkeitsprobleme zu demonstrieren, während Variablen über Threads verteilt werden. Und mir ist aufgefallen, dass ich in fast allen Fällen, in denen ich innerhalb von run () eine System.out.println () -Anweisung im selben Codeblock, in dem ich die shared-Variable verwende, hinzugefügt habe, das Sichtbarkeitsproblem nicht erzeugen kann. Ich werde ein Beispiel geben:

Konfigurationsdetails - Oracle Java6 64bit, Eclipse Juno SR 2

  • 1) MIT VISIBILITÄT PROBLEM:

    %Vor%

    }

AUSGABE: Der Thread läuft unendlich weiter

  • 2) OHNE SICHTBARKEIT:

DER GLEICHE CODE WIE OBEN, MIT DEM NICHT KOMMENTIERTEN println () STATEMENT IM RUN ()

AUSGABE:

...

Wenn Sie diese Zeile auskommentieren, funktioniert der Code ohne das Sichtbarkeitsproblem

Wenn Sie diese Zeile auskommentieren, funktioniert der Code ohne das Sichtbarkeitsproblem

Wenn Sie diese Zeile auskommentieren, funktioniert der Code ohne das Sichtbarkeitsproblem

x: 19391

keepRunning ist falsch

Da ich in allen Beispielen, die ich ausprobiert habe, ein ähnliches Verhalten beobachtet habe, frage ich mich, ob es vor einer E / A-Operation eine Datenintegritätsprüfung durch JVM gibt.

    
Biman Tripathy 16.12.2015, 12:05
quelle

2 Antworten

9

PrintWriter ist synchronisiert

%Vor%

Zwei aufeinanderfolgende Aufrufe von System.out.println() im Hauptthread und im zweiten Thread erzeugen eine Synchronisationsreihenfolge zwischen zwei Threads. Das bedeutet, dass alle Aktionen (in Ihrem Fall ist es eine variable Aktualisierung), die im Hauptthread vor dem Freigeben eines Monitors passiert sind (synchronisierte Methode beenden), vom Code erkannt werden, der im zweiten Thread ausgeführt wird, nachdem er einen Monitor erfasst hat (synchronisierte Methode eingeben). .

In einfachen Worten, ja, ruft System.out.println() diese Synchronisation auf.

    
AdamSkywalker 16.12.2015, 12:13
quelle
1

Dieses Verhalten ist implementierungsspezifisch. In OpenJDK wird println 's Körper synchronisiert, obwohl API gibt das nicht an.

    
Pétur Ingi Egilsson 16.12.2015 12:23
quelle

Tags und Links