Je sais que l'utilisation du synchronize
mot - clé avant une méthode apporte la synchronisation à cet objet. Autrement dit, 2 threads exécutant la même instance de l'objet seront synchronisés.
Cependant, puisque la synchronisation est au niveau de l'objet, 2 threads exécutant différentes instances de l'objet ne seront pas synchronisés. Si nous avons une variable statique dans une classe Java qui est appelée par la méthode, nous aimerions qu'elle soit synchronisée entre les instances de la classe. Les deux instances s'exécutent dans 2 threads différents.
Pouvons-nous réaliser la 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 puisque nous avons défini un objet lock
qui est statique et que nous utilisons le mot-clé synchronized
pour ce verrou, la variable statique count
est maintenant synchronisée entre les instances de la classe Test
?
Réponses:
Il existe plusieurs façons de synchroniser l'accès à une variable statique.
Utilisez une méthode statique synchronisée. Cela se synchronise sur l'objet de classe.
Synchronisez explicitement sur l'objet de classe.
Synchronisez sur un autre objet statique.
La méthode 3 est la meilleure dans de nombreux cas car l'objet de verrouillage n'est pas exposé en dehors de votre classe.
la source
Test.class
et potentiellement gâcher votre journée. De plus, l'initialisation de classe s'exécute avec un verrou sur la classe détenue, donc si vous avez des initialiseurs de classe fous, vous pouvez vous donner des maux de tête.volatile
n'aide pascount++
car c'est une séquence de lecture / modification / écriture. Comme indiqué dans une réponse différente,java.util.concurrent.atomic.AtomicInteger
est probablement le bon choix ici.Test.class
.this
serait le verrou pour les méthodes non statiques synchroniséesSi vous partagez simplement un compteur, envisagez d'utiliser un AtomicInteger ou une autre classe appropriée du package java.util.concurrent.atomic:
la source
Oui c'est vrai.
Si vous créez deux instances de votre classe
Ensuite, t1.foo et t2.foo se synchronisent tous les deux sur le même objet statique et se bloquent donc mutuellement.
la source
Vous pouvez synchroniser votre code sur la classe. Ce serait le plus simple.
J'espère que vous trouverez cette réponse utile.
la source
Test.class
et affecter le comportement. C'est pourquoi la synchronisation surlock
peut être préférée.Nous pouvons également utiliser ReentrantLock pour réaliser la synchronisation des variables statiques.
la source