Java Multithread Accès Variable Statique
Comment puis-je accéder à une variable statique à partir de plusieurs threads simultanément.
Si j'ai une classe comme
Class A {
public static boolean FLG=false;
.....................
....................
}
Et j'ai besoin d'accéder à la valeur de 1 thread comme
....................
public void run() {
boolean t1=A.FLG;
..................
}
et de fil 2 je besoin pour mettre en valeur comme
....................
public void run() {
A.FLG=true;
..................
}
Est-ce à cause de violation de la mémoire ?. Si oui quel est la méthode recommandée pour gérer une telle situation?.
OriginalL'auteur Haris | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
Envelopper la variable statique dans une méthode synchronisée et l'appel à la méthode que vous le souhaitez
Noter qu'il existe d'autres moyens pour synchroniser l'accès à une méthode. Ils sont considérés comme plus efficace dans les environnements occupé threads accèdent à la même méthodes.
Vérifier la ReentrantLock classe. Il y a aussi des réponses pour quand utiliser synchronisé et RentrantLock et beaucoup plus d'informations qui pourrait être trouvé dans google.
Aussi comme
peter
's réponse etmuel
'commentaire suggère. Le marquage de laboolean
variable, alors que la volatilité devrait être utile.volatile
variables booléennes sera PAS cache à sa valeur initiale (false
outrue
). La JVM peut faire de temps en temps qui pourrait être inattendu par le programmeur.édité. Merci 🙂
Si la variable est utilisée exactement comme on peut le voir dans l'exemple de code. Le champ peut même être totalement protégés. Thread 2 sera sa valeur, et le Thread 1 finira par voir le changement. Si la lecture rassis valeurs est acceptable,
volatile
peut être omis, comme l'écrit pour les booléens sont atomiques sur les plates-formes 32 bit.Qui exemple de code que tu veux dire ?
Thread 2...that change
: Que voulez-vous dire ?OriginalL'auteur Muhammad Gelbana
Si tout ce que vous voulez faire est d'obtenir et de définir un primitif, vous pouvez le faire
volatile
et il va être thread-safe pour ces opérations.Hmm, intéressant. Je pense que c'est vrai que "le
volatile
mot-clé dans Java est mal documentée, mal compris, et rarement utilisé". De toute façon, regardevolatile
n'est pas tout à fait équivalents à faire de la accesseurs pour le domainesynchronized
.OriginalL'auteur Peter Lawrey
Vous pouvez obtenir des indésirables situation où deux threads tentent de définir des valeurs différentes dans une variable statique et vous n'aurez pas sûr de ce que exactement la valeur est vraiment là. Le meilleur moyen (de la pensée dans un scénario simple) je pense que c'est à l'aide de AtomicBoolean ( http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html ) et vous obtenez la valeur de l'objet et de l'utiliser (au lieu d'utiliser l'objet de tous les temps, en raison d'un thread différent peut changer et vous pourriez obtenir un scénario inattendu).
Une autre suggestion est d'utiliser Byteman pour créer simultanées tests.
Ce qui concerne,
Luan
OriginalL'auteur lcestari
Dans la Classe A , vous pouvez créer un jeu et de la méthode get pour FLG comme:
Maintenant d'autres Threads, l'accès de la valeur de
FLG
en utilisant cette méthode. Cela permet de garder la valeur deFLG
Cohérente sur plusieurs Threads.J'ai édité ma réponse , vous pouvez définir la valeur de ce genre.
OriginalL'auteur Nargis
Si vous ne souhaitez pas utiliser synchronisée, ReentrantLock,
vous pouvez écrire votre propre logique pour cela.
Exemple:
OriginalL'auteur Amal