Enregistrez simplement comment utiliser le mot-clé synchronisé en Java.
Avant l'introduction, il est nécessaire de préciser que chaque instance d'objet d'une classe en Java a et n'a qu'un seul verrou (lock) qui lui est associé. Le mot-clé synchronisé n'agit que sur ce verrou, c'est-à-dire qu'il peut être considéré comme synchronisé uniquement. affecte les instances d'objet de l'effet de classe Java.
fonction modifiée synchronisée
Copiez le code comme suit :
public synchronisé aMethod(){
}
Il s’agit du scénario le plus couramment utilisé, alors quel est le but de cette méthode de synchronisation, pour plus de commodité, elle est appelée méthode aMethod ?
1. Ce qui verrouille la synchronisation est l'instance d'objet qui appelle cette méthode de synchronisation. Par exemple, la synchronisation se produira lorsque la même instance P1 appelle aMethod dans différents threads ;
2. Il est à noter qu'un autre objet P2 de la classe à laquelle appartient cet objet peut appeler cette aMethod arbitrairement, car les méthodes synchronisées des différentes instances d'objet n'interfèrent pas les unes avec les autres. En d’autres termes, d’autres threads peuvent toujours accéder simultanément à la méthode aMethod dans une autre instance d’objet de la même classe ;
3. Si un objet possède plusieurs méthodes synchronisées, telles que aMethod, bMethod et cMethod, tant qu'un thread accède à l'une des méthodes synchronisées, les autres threads ne peuvent accéder simultanément à aucune méthode synchronisée dans l'objet.
Le code ci-dessus est en fait équivalent au suivant :
Copiez le code comme suit :
public void aMethod() {
synchronisé (ce) {
}
}
Il s'agit ici de la référence de l'objet instance, tel que P1. On peut voir que l'essence de la méthode de synchronisation est d'appliquer la synchronisation à la référence de l'objet. Seul le thread qui a obtenu le verrou d'objet P1 peut appeler la méthode de synchronisation de P1. En ce qui concerne P2, le verrou P1 n'a rien à voir avec cela. Le programme peut également se débarrasser du contrôle du mécanisme de synchronisation. situation, provoquant une confusion dans les données. De là, nous dérivons le bloc de synchronisation ci-dessous.
bloc de code modifié synchronisé
Copiez le code comme suit :
public void dMethod (SomeObject donc) {
synchronisé(donc) {
}
}
Le verrou obtenu par synchronisé ici est le verrou de l'objet so, donc celui qui obtient le verrou peut exécuter le code qu'il contrôle. Lorsqu'il y a un objet clair comme verrou, vous pouvez écrire le programme comme ceci, mais lorsqu'il n'y a pas d'objet clair comme verrou et que vous souhaitez simplement synchroniser un morceau de code, vous pouvez créer une variable d'instance spéciale (elle doit être un objet) pour faire office de verrou :
Copiez le code comme suit :
la classe Foo implémente Runnable {
octet privé[] verrou = nouvel octet[0];
Méthode vide publique() {
synchronisé (verrouillage) {
}
}
}
Un objet tableau d’octets de longueur nulle sera plus rentable à créer que tout autre objet.
méthode statique modifiée synchronisée
Comme mentionné précédemment, le mot-clé synchronisé n'est valide que pour les instances P1 dans différents threads. Alors, comment peut-il être valide pour différentes instances de P1 et P2 en même temps ? La réponse est d'utiliser synchronisé pour modifier les méthodes statiques. on peut dire qu'une classe appartient à cette classe. Elle ne dépend pas des instances de la classe, il suffit donc d'utiliser le mot-clé synchronisé pour modifier les méthodes statiques de la classe afin d'obtenir la synchronisation entre les différentes instances.