Freigabe einer Variablen zwischen mehreren verschiedenen Threads

9

Ich möchte eine Variable zwischen mehreren Threads wie folgt teilen:

%Vor%

Ich möchte flag zwischen main und help thread freigeben, wo es sich um zwei verschiedene Java-Klassen handelt, die ich erstellt habe. Gibt es einen Weg, dies zu tun? Vielen Dank!

    
user1031431 27.11.2012, 10:40
quelle

5 Antworten

18

Sowohl T1 als auch T2 können auf eine Klasse verweisen, die diese Variable enthält. Sie können dann diese Variable flüchtig machen, und das bedeutet, dass Änderungen an dieser Variablen sofort in beiden Threads sichtbar sind.

Weitere Informationen finden Sie in diesem Artikel .

  

Volatile Variablen teilen die Sichtbarkeitsfunktionen von synchronized, aber   keine der Atomizitätsmerkmale. Dies bedeutet, dass Threads werden   automatisch den aktuellsten Wert für flüchtige Variablen sehen.   Sie können verwendet werden, um die Fadensicherheit zu gewährleisten, aber nur in einem sehr   begrenzte Anzahl von Fällen: solche, die keine Zwänge zw   mehrere Variablen oder zwischen dem aktuellen Wert einer Variablen und ihrer   zukünftige Werte.

und notieren Sie die Vor- / Nachteile der Verwendung von volatilen vs komplexeren Möglichkeiten der Freigabe von Staat.

    
Brian Agnew 27.11.2012, 10:41
quelle
6

Zusätzlich zu den anderen Vorschlägen können Sie das Flag auch in eine Steuerelementklasse einfügen und eine letzte Instanz in der übergeordneten Klasse erstellen:

%Vor%     
OldCurmudgeon 27.11.2012 11:14
quelle
4
  1. Das Problem könnte dadurch behoben werden.
  2. Verweise auf den Haupt-Thread in einem anderen Thread und machen diese Variable sichtbar
Romczyk 27.11.2012 10:42
quelle
3

Um es zwischen den Instanzen von T1 und T2 sichtbar zu machen, könnten Sie die beiden Klassen veranlassen, einen Verweis auf ein Objekt zu enthalten, das die Variable enthält.

Wenn die Variable geändert werden soll, wenn die Threads ausgeführt werden, müssen Sie die Synchronisierung in Betracht ziehen. Der beste Ansatz hängt von Ihren genauen Anforderungen ab, aber die wichtigsten Optionen sind wie folgt:

  • Machen Sie die Variable volatile ;
  • Verwandle es in eine AtomicBoolean ;
  • verwenden Sie eine vollständige Synchronisation um Code, der sie verwendet.
NPE 27.11.2012 10:43
quelle
0

Sie können die Sperrvariablen "a" und "b" verwenden und sie synchronisieren, um den "kritischen Abschnitt" in umgekehrter Reihenfolge zu sperren. Z.B. Benachrichtige "a", dann "b", "DRUCKEN", Benachrichtige "b" und dann "a".

Bitte beachten Sie den folgenden Code: -

%Vor%

}

AUSGABE: - 1 A 2 B 3 A 4 B 5 A 6 B 7 A 8 B 9 A 10 B

    
AkashPushPopStack 30.12.2017 16:08
quelle