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
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.
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.
Dieses Verhalten ist implementierungsspezifisch. In OpenJDK wird println
's Körper synchronisiert, obwohl API gibt das nicht an.
Tags und Links java multithreading