La documentation Java dit:
Il n'est pas possible que deux invocations de méthodes synchronisées sur le même objet s'entrelacent.
Qu'est-ce que cela signifie pour une méthode statique? Puisqu'une méthode statique n'a pas d'objet associé, le mot clé synchronisé se verrouille-t-il sur la classe au lieu de l'objet?
this
le verrou est-il acquis sur les méthodes d'instance -, veuillez le réparer Oscar.Juste pour ajouter un petit détail à la réponse d'Oscar (agréablement succincte!), La section pertinente sur la spécification du langage Java est 8.4.3.6, `` Méthodes synchronisées '' :
la source
Un point auquel vous devez faire attention (plusieurs programmeurs tombent généralement dans ce piège) est qu'il n'y a aucun lien entre les méthodes statiques synchronisées et les méthodes non statiques synchronisées, c'est-à-dire:
Principale:
Fil 1:
Fil 2:
f () et g () ne sont pas synchronisés l'un avec l'autre et peuvent donc s'exécuter totalement simultanément.
la source
synchronized (MyClass.class) {...}
.Sauf si vous implémentez g () comme suit:
Je trouve ce modèle utile également lorsque je souhaite implémenter une exclusion mutuelle entre différentes instances de l'objet (ce qui est nécessaire lors de l'accès à une ressource externe, par exemple).
la source
getClass()
renvoie le type d' exécution ; si vous sous-classez la classe, la classe parente et la classe enfant se synchroniseront sur des verrous différents.synchronized(MyClass.class)
est la voie à suivre si vous devez vous assurer que toutes les instances utilisent le même verrou.Consultez la page de documentation d'Oracle sur les verrous intrinsèques et la synchronisation
la source
Une méthode statique a également un objet associé. Il appartient au fichier Class.class dans la boîte à outils JDK. Lorsque le fichier .class est chargé dans la mémoire vive, le Class.class en crée une instance appelée objet modèle.
Par exemple: - lorsque vous essayez de créer un objet à partir d'une classe client existante comme
Le chargement de Customer.class dans la RAM. À ce moment-là, Class.class dans la boîte à outils JDK crée un objet appelé objet Template et charge ce Customer.class dans cet objet template. Les membres statiques de ce Customer.class deviennent des attributs et des méthodes dans cet objet template.
Ainsi, une méthode ou un attribut statique a également un objet
la source
Les exemples ci-dessous donnent plus de clarté entre le verrouillage de classe et d'objet, espérons que l'exemple ci-dessous aidera également les autres :)
Par exemple, nous avons ci-dessous des méthodes une acquéreur de classe et une autre acquisition d'objet verrou:
Donc, maintenant, nous pouvons avoir les scénarios suivants:
Lorsque les threads en utilisant un même objet tente d'accéder
objLock
OUstaticLock
méthode même temps ( les deux threads tentent d'accéder à même méthode)Lorsque les threads utilisant le même objet essaient d'accéder aux méthodes
staticLock
et enobjLock
même temps (essaie d'accéder à différentes méthodes)Lorsque des threads utilisant un objet différent essaient d'accéder à la
staticLock
méthodeLorsque des threads utilisant un objet différent essaient d'accéder à la
objLock
méthodela source
Pour ceux qui ne sont pas familiers avec la méthode statique synchronisée verrouillée sur un objet de classe, par exemple pour la classe string sa String.class tandis que la méthode synchronisée par instance se verrouille sur l'instance actuelle d'Objet désignée par le mot-clé «this» en Java. Étant donné que ces deux objets sont différents, ils ont un verrou différent.Ainsi, pendant qu'un thread exécute une méthode statique synchronisée, un autre thread en java n'a pas besoin d'attendre le retour de ce thread à la place, il acquiert un verrou séparé noté octet .class littéral et entre dans méthode statique synchronisée.
la source