Est un volatile int en Java thread-safe?
Est un volatile int
en Java thread-safe? C'est, peut-il être en toute sécurité en lecture et en écriture sans verrouillage?
Vous devez vous connecter pour publier un commentaire.
Est un volatile int
en Java thread-safe? C'est, peut-il être en toute sécurité en lecture et en écriture sans verrouillage?
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez lire et d'écrire en toute sécurité - mais vous ne pouvez pas faire quelque chose de composé tel que l'incrémentation en toute sécurité, car c'est une lecture/modification/écriture cycle. Il y a aussi la question de comment il interagit avec l'accès à autres variables.
La nature précise de la volatilité est franchement déroutant (voir la modèle de mémoire de la section de la JLS pour plus de détails) - je voudrais personnellement généralement utiliser
AtomicInteger
au lieu de cela, comme un moyen plus simple de vous assurer que je comprends bien.volatile int
en toute sécurité, mais vous aurez besoin de le remplacer++
avec un chargement entierAtomicIntegerFieldUpdater
. (Pas aussi rapide, mais si l'accès est dominé par simple lecture/écriture et/ou de surcharge de mémoire est important, il peut être utile)Oui, une lecture sera toujours le résultat d'une valeur de la dernière écriture, (et les lectures et les écritures sont des opérations atomiques).
Un volatile de lecture /écriture introduit une sorte de passe-avant dans l'exécution.
De la Java Language Specification Chapitre 17: les Threads et les Verrous
En d'autres termes, lorsqu'il s'agit de variables que vous n'avez pas explicitement à synchroniser (introduire un passe-avant le rapport) à l'aide de
synchronized
mot-clé afin de s'assurer que le fil est la dernière valeur écrite dans la variable.Comme Jon Skeet points de plus, l'utilisation de variables sont limitées, et vous devriez en considération en général à l'aide de classes à partir de la
java.util.concurrent
paquet.volatile
variables, il y a pas une telle chose comme "la dernière valeur écrite dans la variable". Vous avez besoinvolatile
pour le membre de phrase "la dernière valeur écrite dans la variable" avoir du sens.x = 1; x = 2;
dans un thread, et puisSystem.out.println(x)
dans un autre (de temps aprèsx = 2
a été exécutée, elle peut toujours imprimer1
. Ce que je veux dire c'est que si2
était la dernière valeur écrite àx
, puisx
peut pas encore évaluer à2
dans un autre thread.x
n'est pasvolatile
: "aprèsx = 2
a été exécuté"avant/x = 2
a été exécuté n'est pas bien défini. Si vous avez vraiment lux
après qu'il a été fixé à 2, alors bien sûr, vous obtiendrez 2.L'accès à l'volatile int en Java thread-safe. Quand je dis d'accès, je veux dire le fonctionnement de l'appareil sur elle, comme volatile_var = 10 ou int temp = volatile_var (essentiellement de lecture/écriture avec des valeurs constantes). Mot clé Volatile en java garantit deux choses :
Cependant Jon Skeet mentionne, à juste titre, que dans les opérations atomiques (volatile_var = volatile + 1) différents threads peuvent obtenir résultat inattendu.
Si volatile qui ne dépend d'aucun autre variable volatile son thread-safe pour une opération de lecture. Dans le cas d'une écriture volatile ne garantit pas la sécurité des threads.
Supposons que vous disposez d'une variable i qui est volatile et sa valeur est dépendante d'une autre variable volatile dire j. Maintenant Thread-1 accès à la variable j et l'incrémenter et est sur le point de le mettre à jour dans la mémoire principale de cache du PROCESSEUR. Dans le cas où le Fil-2 lit l'
la variable i avant que le Thread-1 peut effectivement mettre à jour la j dans la mémoire principale. La valeur de i sera que par l'ancienne valeur de j qui serait incorrect. Il est aussi appelé lecture Sale.
Pas toujours.
Ce n'est pas thread-safe si plusieurs threads sont l'écriture et la lecture de la variable. C'est thread-safe si vous en avez un thread d'écriture et de plusieurs threads de lecture.
Si vous êtes à la recherche pour le Fil en toute sécurité, utilisez AtomicXXX classes
Reportez-vous à @teto réponse ci-dessous post:
Volatile boolean vs AtomicBoolean
1) Si les deux fils sont à la fois la lecture et l'écriture d'une variable partagée, puis en utilisant le mot clé volatile pour qui n'est pas assez. Vous devez utiliser un synchronisé dans ce cas, afin de garantir que la lecture et l'écriture de la variable est atomique. La lecture ou l'écriture d'une variable volatile ne bloque pas les threads de lecture ou d'écriture. Pour cela, vous devez utiliser le mot-clé synchronized autour de sections critiques.
2) Comme une alternative à un bloc synchronisé vous pouvez également utiliser l'un des nombreux atomique types de données trouvées dans le java.util.simultanées paquet. Par exemple, le AtomicLong ou AtomicReference ou l'un des autres.
C'est thread-safe si vous en avez un thread d'écriture et de plusieurs threads de lecture.
Remarque : Si l'assistant est immuable, alors pas besoin de mot-clé volatile.Ici singleton de fonctionner correctement.
En cas de compteur qui est incrémenté par plusieurs threads (lecture, écriture) ne donnera pas de réponse correcte. Cette condition est également illustré en condition de course.
REMARQUE : Ici volatile ne va pas aider.