Comment puis-je utiliser AtomicBoolean et à quoi sert cette classe?
java
concurrency
yart
la source
la source
volatile boolean
vsAtomicBoolean
: stackoverflow.com/questions/3786825/…Réponses:
Lorsque plusieurs threads doivent vérifier et modifier le booléen. Par exemple:
Ce n'est pas thread-safe. Vous pouvez le corriger en utilisant
AtomicBoolean
:la source
true
quandinitialize()
ils ne sont pas terminés. Donc, cela ne fonctionne que si les autres threads ne se soucient pas de l'achèvement deinitialize()
.initialized
est simplement utilisé pour garantir qu'un et un seul thread invoquera lainitialize()
méthode. Évidemment,initialized
être vrai ne signifie pas que l'initialisation est définitivement terminée dans ce cas, donc peut - être qu'un terme légèrement différent serait mieux ici. Encore une fois, cela dépend de son utilisation.volatile boolean
la même chose queAtomicBoolean
?.synchronized
bloc, auquel cas vous n'avez plus besoin d'unAtomicBoolean
, juste d'unvolatile boolean
. (if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
garantira qu'un seul thread appelleinitialize
et que tous les autres threads l'attendent, à condition que celainitialized
soit marquévolatile
.)Voici les notes (du livre de Brian Goetz ) que j'ai prises, qui pourraient vous être utiles
Classes AtomicXXX
fournir une implémentation de comparaison et d'échange non bloquante
Profite de la prise en charge fournie par le matériel (l'instruction CMPXCHG sur Intel) Lorsque de nombreux threads s'exécutent dans votre code qui utilise ces API de concurrence atomique, ils évolueront bien mieux que le code qui utilise des moniteurs / synchronisation au niveau objet. Étant donné que les mécanismes de synchronisation de Java font attendre le code, lorsqu'il y a beaucoup de threads qui traversent vos sections critiques, une quantité substantielle de temps CPU est consacrée à la gestion du mécanisme de synchronisation lui-même (attente, notification, etc.). Étant donné que la nouvelle API utilise des constructions de niveau matériel (variables atomiques) et des algorithmes d'attente et de verrouillage gratuits pour implémenter la sécurité des threads, beaucoup plus de temps CPU est consacré à "faire des choses" plutôt qu'à gérer la synchronisation.
non seulement offrent un meilleur débit, mais ils offrent également une plus grande résistance aux problèmes de vivacité tels que l'impasse et l'inversion de priorité.
la source
Il y a deux raisons principales pour lesquelles vous pouvez utiliser un booléen atomique. D'abord son mutable, vous pouvez le passer comme référence et changer la valeur associée au booléen lui-même, par exemple.
et dans la classe someObject
Plus important encore, son thread est sûr et peut indiquer aux développeurs qui maintiennent la classe que cette variable devrait être modifiée et lue à partir de plusieurs threads. Si vous n'utilisez pas un AtomicBoolean, vous devez synchroniser la variable booléenne que vous utilisez en la déclarant volatile ou en la synchronisant autour de la lecture et de l'écriture du champ.
la source
La
AtomicBoolean
classe vous donne une valeur booléenne que vous pouvez mettre à jour atomiquement. Utilisez-le lorsque plusieurs threads accèdent à une variable booléenne.La vue d'ensemble du package java.util.concurrent.atomic vous donne une bonne description de haut niveau de ce que font les classes de ce package et quand les utiliser. Je recommanderais également le livre Java Concurrency in Practice de Brian Goetz.
la source
Extrait de la description du package
la source