Comment synchroniser une variable statique entre les threads qui exécutent différentes instances d'une classe en Java?
Je sais que l'utilisation de la synchronize
mot-clé avant une méthode apporte la synchronisation de l'objet. C'est, 2 threads s'exécutant sur la même instance de l'objet seront synchronisés.
Cependant, depuis la synchronisation est au niveau de l'objet, 2 threads s'exécutant différentes instances de l'objet ne seront pas synchronisées. Si nous avons une variable statique dans une classe Java qui est appelée par la méthode, que l'on voudrait être synchronisés sur l'ensemble des instances de la classe. Les deux instances sont en cours d'exécution dans les 2 threads différents.
Pouvons-nous obtenir une synchronisation de la manière suivante?
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(lock)
{
count++;
}
}
}
Est-il vrai que, depuis, nous avons défini un objet lock
qui est statique et nous utilisons le mot-clé synchronized
pour que le verrouillage, la variable statique count
est maintenant synchronisé entre les instances de la classe Test
?
- toutes ces réponses sont INUTILES à moins que le verrou de l'objet est déclarée FINAL!
- Regardez aussi java.util.de façon concomitante.atomique.AtomicInteger
Vous devez vous connecter pour publier un commentaire.
Il existe plusieurs façons de synchroniser l'accès à une variable statique.
Utiliser un synchronisé méthode statique. Il synchronise sur la classe de l'objet.
Explicitement synchroniser sur la classe de l'objet.
Synchroniser sur un autre objet statique.
La méthode 3 est le meilleur, dans de nombreux cas, parce que le verrou de l'objet n'est pas exposée à l'extérieur de votre classe.
Test.class
et potentiellement gâcher votre journée. Aussi, initialisation de classe s'exécute avec un verrou sur la tenue de classe, donc si vous avez des classe folle initialiseurs vous pouvez donner vous-même des maux de tête.volatile
n'aide pas pourcount++
parce que c'est une lecture / modification / écriture de la séquence. Comme indiqué dans une réponse différente,java.util.concurrent.atomic.AtomicInteger
est probablement le bon choix ici.Test.class
.this
serait la serrure pour la synchronisation de la non-static méthodesSi vous êtes tout simplement le partage d'un compteur, envisager l'utilisation d'un AtomicInteger ou d'une autre, adapté de la classe de java.util.de façon concomitante.atomique package:
Oui, c'est vrai.
Si vous créez deux instance de votre classe
Alors t1.foo et t2.foo à la fois de synchroniser sur le même objet statique et donc de bloquer les uns les autres.
Vous pouvez synchroniser votre code sur la classe. Ce serait plus simple.
Espérons que vous trouverez cette réponse utile.
Test.class
et influer sur le comportement. C'est pourquoi la synchronisation sur leslock
pourrait être préférée.