Quand dois-je utiliser AtomicBoolean en Java?
Comment je peux l'utiliser AtomicBoolean et qu'est-ce que cette catégorie pour?
- Connexes:
volatile boolean
vsAtomicBoolean
: stackoverflow.com/questions/3786825/...
Vous devez vous connecter pour publier un commentaire.
Lorsque plusieurs threads besoin de vérifier et de modifier la valeur de type boolean. Par exemple:
Ce n'est pas thread-safe. Vous pouvez y remédier en utilisant
AtomicBoolean
:true
quandinitialize()
n'ont pas été achevé. Donc, il ne fonctionne que si les autres threads ne se soucient pas de l'achèvement deinitialize()
.initialized
est simplement utilisé pour s'assurer que un et un seul thread appelle lainitialize()
méthode. Évidemmentinitialized
être vrai, ne signifie pas que l'initialisation a définitivement achevé dans ce cas, peut-être un peu différent en terme serait mieux ici. Encore une fois, cela dépend de ce qu'il est utilisé pour des.initialize()
méthode àstart()
ou quelque chose d'autre qui n'est pas le problème autour de la classe utilisée par les fils avant qu'il soit complètement initialisé? Merci.volatile boolean
être même queAtomicBoolean
?.compareAndSet
, qui sont effectivement pas réalisables sans une sorte de synchronisationsynchronized
bloc, dans ce cas, vous n'avez plus besoin d'unAtomicBoolean
, juste unvolatile boolean
. (if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
doit s'assurer que seul un thread appelleinitialize
, et que tous les autres threads en attente pour elle de l'avoir fait, à condition queinitialized
est marquévolatile
.)AtomicBoolean
instance de différentes classes et obtenir la même valeur, si vous envoyezBoolean
instance à un autre constructeur de la classe, puis vous obtenez une nouvelle variable, mais avecAtomicBoolean
vous obtenez la même instance de référence et avec la même valeur et la valeur est modifiée dans toutes les instances (ce serait même, il n'est pas n'importe où à partir de laquelle l'instance, il a été changé)Voici les notes (à partir de Brian Goetz livre) que j'ai fait, que peut-être vous aider
AtomicXXX classes
Non-bloquant Compare-and-Swap de mise en œuvre
Profite de l'appui de fournir
par le matériel (le CMPXCHG instruction
sur Intel) Lorsque beaucoup de threads sont
l'exécution de votre code qui utilise
ces atomique de la simultanéité de l'API, ils
à l'échelle beaucoup mieux que le code
qui utilise le niveau de l'Objet
les moniteurs de la synchronisation. Depuis,
Java mécanismes de synchronisation
rend le code d'attendre, quand il y a beaucoup
de threads en cours d'exécution par le biais de votre
les sections critiques, une importante
quantité de temps PROCESSEUR est passé dans
la gestion de la synchronisation
mécanisme en lui-même (en attente, en notifiant,
etc.). Depuis la nouvelle API utilise le matériel
au niveau des constructions atomiques (variables)
et d'attendre, et de verrouiller les algorithmes sans pour
mettre en œuvre fil de sécurité, beaucoup plus
de temps PROCESSEUR est passé de "faire des trucs"
plutôt que dans la gestion de
la synchronisation.
ne vous offrons pas seulement mieux
le débit, mais ils fournissent également
une plus grande résistance à liveness
des problèmes tels que l'impasse
inversion de priorité.
Il y a deux principales raisons pourquoi vous pouvez utiliser atomique de type boolean. D'abord par son mutable, vous pouvez le passer en tant que référence, et modifier la valeur qui est associée à la boolean lui-même, par exemple.
et dans le someObject classe
Plus important encore, son thread-safe et peut lui indiquer les développeurs de maintien de la classe, que cette variable devrait être modifié et lire à 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 volatils ou de synchronisation autour de la lecture et de l'écriture du champ.
AtomicBoolean
à dire, compareAndSet, alors il n'y aurait pas toutes les conditions de course.La
AtomicBoolean
classe vous donne une valeur booléenne que vous pouvez mettre à jour automatiquement. L'utiliser lorsque vous avez plusieurs threads accèdent à une variable booléenne.La java.util.de façon concomitante.atomique présentation du package vous donne une bonne description de haut niveau de ce que les classes de ce package ne et quand les utiliser. Je recommande aussi le livre Java de la Simultanéité dans la Pratique par Brian Goetz.
Extrait de la description du package de