2016-06-17 14 views
1

So habe ich viele asyn-Threads gleichzeitig ausgeführt. Jetzt, wenn einer der Jobs fehlschlägt, setze ich den Boolean Job Failed Flag auf True. Das würde anzeigen, dass eine der Unteraufgaben fehlgeschlagen ist. Kann ich statische boolesche Variable anstelle von Java gleichzeitig atomaren booleschen verwenden und trotzdem die gleiche Funktionalität erreichen?Unterschied zwischen der Verwendung von statischen boolean vs AtomicBoolean für Signale von asyn-Threads

+1

'static' bedeutet geteilt garenty. Es hat nichts mit Fadensicherheit oder Atomkraft zu tun. –

Antwort

1

Kann ich statische boolesche Variable anstelle von Java gleichzeitig atomaren boolean verwenden und immer noch die gleiche Funktionalität erreichen?

Nein! Statisch bedeutet etwas ganz anderes zu Atomic

, wenn Sie diese definieren

static boolean staticFlag; 

in einer Klasse Foo, dann staticFlag ist eine Variable, die Klasse und nicht die Instanzen der Klasse gehört ...

so, wenn Sie tun Foo.staticFlag = true, ALLE die Instanzen der Klasse Foo wird von dieser Änderung betroffen sein ..

o n die andere Seite ..

wenn mehrere Threads ein gleiches boolean Zugriff dann haben Sie eine Race-Bedingung Ameise dort können Sie einen AtomicBoolean verwenden zu Synchronisationsproblemen zu vermeiden ...

0

Ja. Sie können

haben
volatile static AtomicBoolean flag 
1

Soweit ich verstehe, Sie „nur“ einen globalen Zustand auf true gesetzt werden soll, wenn eine von vielen Fäden Failes etwas zu tun. Ja, Sie können das mit einem statischen Booleschen Wert tun, aber Sie sollten es als volatil deklarieren.

In meiner Welt können Sie das tun, weil keiner Ihrer Threads jemals auf diesen Boolean für den Vergleich usw. zugreifen wird. Wenn sie darauf zugreifen, werden sie es auf wahr setzen. Es interessiert sie nicht, welchen Wert der Boolean hat. Kein Thread wird es jemals auf false setzen.

+1

Aber ein anderer Thread muss es lesen, so dass es nicht "falsch" ist und da hast du dein Problem. Sie müssen es in diesem Fall als volatil deklarieren. –

+0

Wenn Sie es auf "volatile" setzen, ist es egal, ob der Wert mehrfach geändert wurde. Die grundlegende Antwort ist jedoch richtig: ein 'static volatile boolean' ist, was er will. –

0

Der Hauptunterschied istThread-Safety, AtomicBoolean ist Thread-sicher, während boolean Variable ist nicht Thread-sicher, unabhängig davon, ob seine statische oder nicht. Statische Variable bedeutet, dass es sich um eine Klassenvariable und nicht um eine Instanzvariable handelt. siehe Oracle class variable

Ihre Frage

zu beantworten, wenn Sie (Lesen/Schreiben) Ihre Fahne von verschiedenen Threads zugreifen (die Sie wahrscheinlich tun), verwenden AtomicBoolean, sonst verwenden Standard boolean genug ist. Aber Ich würde empfehlen, die AtomicBoolean zu verwenden, da Sie mit wenigen Threads beschäftigen, die auf die Flagge schreibt, und ein anderer Thread kann es lesen.

Eine zweite Option Ihre Thread-Sicherheit zu sichern, indem volatile Schlüsselwörter wie andere Antworten und mit dem angegebenen

public static volatile myFlag = false; 

wird in allen Instanzen Thread-Sicherheit