Wie kann ich AtomicBoolean verwenden und wofür ist diese Klasse?
java
concurrency
yart
quelle
quelle
volatile boolean
vsAtomicBoolean
: stackoverflow.com/questions/3786825/…Antworten:
Wenn mehrere Threads den Booleschen Wert überprüfen und ändern müssen. Beispielsweise:
Dies ist nicht threadsicher. Sie können das Problem beheben, indem Sie Folgendes verwenden
AtomicBoolean
:quelle
true
wenn sieinitialize()
noch nicht abgeschlossen sind. Es funktioniert also nur, wenn andere Threads sich nicht um die Fertigstellung kümmerninitialize()
.initialized
es einfach verwendet wird, um sicherzustellen, dass nur ein Thread dieinitialize()
Methode aufruft . Offensichtlichinitialized
wahr zu sein bedeutet nicht , dass die Initialisierung auf jeden Fall in diesem Fall abgeschlossen, so vielleicht ein etwas anderer Begriff wäre besser hier. Auch hier kommt es darauf an, wofür es verwendet wird.volatile boolean
dasselbe wieAtomicBoolean
?synchronized
Blocks. In diesem Fall benötigen Sie keinenAtomicBoolean
, nur noch einenvolatile boolean
. (stelltif(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
sicher, dass nur ein Thread aufruftinitialize
und dass alle anderen Threads darauf warten, sofern diesinitialized
markiert istvolatile
.)Hier sind die Notizen (aus dem Buch von Brian Goetz ), die ich gemacht habe und die Ihnen vielleicht helfen könnten
AtomicXXX-Klassen
Bereitstellung einer nicht blockierenden Compare-And-Swap-Implementierung
Nutzt die Unterstützung durch Hardware (die CMPXCHG-Anweisung unter Intel). Wenn viele Threads durch Ihren Code laufen, der diese atomare Parallelitäts-API verwendet, werden sie viel besser skaliert als Code, der Monitore / Synchronisation auf Objektebene verwendet. Da die Synchronisationsmechanismen von Java den Code warten lassen, wenn viele Threads durch Ihre kritischen Abschnitte laufen, wird eine erhebliche Menge an CPU-Zeit für die Verwaltung des Synchronisationsmechanismus selbst aufgewendet (Warten, Benachrichtigen usw.). Da die neue API Konstrukte auf Hardwareebene (atomare Variablen) und warte- und sperrfreie Algorithmen verwendet, um die Thread-Sicherheit zu implementieren, wird viel mehr CPU-Zeit für "Aufgaben" aufgewendet als für die Verwaltung der Synchronisation.
Sie bieten nicht nur einen besseren Durchsatz, sondern auch einen größeren Widerstand gegen Lebendigkeitsprobleme wie Deadlock und Prioritätsinversion.
quelle
Es gibt zwei Hauptgründe, warum Sie einen atomaren Booleschen Wert verwenden können. Zunächst ist es veränderbar. Sie können es als Referenz übergeben und beispielsweise den Wert ändern, der dem Booleschen Wert selbst zugeordnet ist.
und in der someObject-Klasse
Noch wichtiger ist jedoch, dass der Thread sicher ist und Entwicklern, die die Klasse verwalten, anzeigen kann, dass erwartet wird, dass diese Variable geändert und aus mehreren Threads gelesen wird. Wenn Sie keinen AtomicBoolean verwenden, müssen Sie die von Ihnen verwendete boolesche Variable synchronisieren, indem Sie sie als flüchtig deklarieren oder um das Lesen und Schreiben des Felds herum synchronisieren.
quelle
Die
AtomicBoolean
Klasse gibt Ihnen einen booleschen Wert, den Sie atomar aktualisieren können. Verwenden Sie diese Option, wenn mehrere Threads auf eine boolesche Variable zugreifen.In der Paketübersicht java.util.concurrent.atomic finden Sie eine allgemeine Beschreibung dessen, was die Klassen in diesem Paket tun und wann sie verwendet werden sollen. Ich würde auch das Buch Java Concurrency in Practice von Brian Goetz empfehlen .
quelle
Auszug aus der Paketbeschreibung
quelle