Cet article présente certains points de connaissance sur les mots clés synchronisés dans le multithreading Java comme verrous d'objets.
Le soi-disant verrouillage d'objet signifie synchronisé pour verrouiller un certain objet. Pour référence, veuillez vous référer à: cet article
1. Analyse
Synchronisé peut modifier la méthode d'instance comme suit:
classe publique MyObject {synchronisé public void methoda () {// faire quelque chose ....}Ici, le mot-clé synchronisé verrouille l'objet actuel. Ceci est également appelé verrouillage d'objet.
Pourquoi verrouiller l'objet actuel? Parce que Methoda () est une méthode d'instance, si vous souhaitez exécuter Methoda (), vous devez l'appeler sous la forme d'objet. Method () (obj.methoda (), obj est un objet de la classe MyObject, synchronisé signifie verrouiller l'objet OBJ).
Le code ci-dessus peut également être écrit comme ceci:
classe publique MyObject {public void methoda () {synchronisé (this) {// faire quelque chose ....}}2. Caractéristiques
Une caractéristique évidente de la synchronisation des mots clés synchronisée est que lorsque plusieurs méthodes d'instance modifiées synchronisées sont définies dans la classe MyObject, si plusieurs threads ont le même objet de la classe MyObject, ces méthodes ne peuvent être exécutées que de manière synchrone. Autrement dit, après avoir exécuté une méthode de modification synchronisée, une autre méthode de modification synchronisée peut être exécutée.
comme suit:
classe publique MyObject {synchronisé public void methoda () {// faire quelque chose ....} Public void MethodB () {// faire quelque chose de quelque chose}}Il existe deux méthodes de modification synchronisées dans la classe MyObject.
La classe publique Threada étend Thread {private myObject Object; // omettre le constructeur @Override public void run () {super.run (); object.methoda (); }}Le thread a exécute méthoda ()
classe publique ThreadB étend Thread {private myObject Object; // omettre le constructeur @Override public void run () {super.run (); object.Methodb (); }} Le thread B exécute Methodb ()
classe publique run {public static void main (string [] args) {myObject object = new myObject (); // Thread A et Thread B maintiennent le même objet: objet Threada a = new Threada (objet); ThreadB b = new ThreadB (objet); a.start (); b.start (); }}Étant donné que le thread A et le thread B maintiennent l'objet objet de la même classe MyObject, bien que ces deux threads doivent appeler différentes méthodes, elles doivent être synchronisées. Par exemple, le thread B doit attendre le thread A pour exécuter la méthode Methoda () avant de pouvoir exécuter la méthode MethodB ().
3. Conclusion
Comme on peut le voir à partir de ce qui précède, la portée du verrou synchronisé décrit dans cet article est l'ensemble de l'objet. S'il existe plusieurs méthodes de synchronisation modifiées synchronisées dans une classe et que plusieurs threads détiennent le même objet de la classe (le même objet de la classe), bien qu'ils appellent différentes méthodes, l'exécution de chaque méthode est également synchronisée.
S'il n'y a pas de variables partagées entre chaque méthode synchronisée, ou qu'il n'y a pas de connexion entre chaque méthode, mais elle ne peut être exécutée que de manière synchrone, cela affectera l'efficacité.
4. Application - Utilisez synchronisé pour éviter de lire les données sales en raison de l'incohérence des données
L'exemple suivant:
classe publique myObject {private string username = "b"; Private String Password = "BB"; Synchronisé public void méthoda (String username, String Motword) {this.Username = username; essayez {thread.sleep (5000); } catch (InterruptedException e) {} this.password = mot de passe; } synchronisé public void methodb () {System.out.println ("nom d'utilisateur" + nom d'utilisateur + ":" + "mot de passe" + mot de passe); }}Methoda () est chargé de modifier le nom d'utilisateur et le mot de passe. En réalité, un nom d'utilisateur correspond à un mot de passe.
MethodB () est responsable de la lecture du nom d'utilisateur et du mot de passe.
Si MethodB () n'est pas modifié avec Synchronisé, le thread A modifie le nom d'utilisateur lors de l'appel Methoda () à la ligne 7 et abandonne le CPU pour une raison quelconque (comme le sommeil sur la ligne 9).
À l'heure actuelle, si Thread B exécute MethodB (), le nom d'utilisateur Read est le nom d'utilisateur modifié par le thread A ("A"), mais le mot de passe est le mot de passe d'origine ("BB"). Parce que le thread A dort et n'a pas eu le temps de changer le mot de passe.
Cependant, si MethodB () est modifié avec synchronisé, le thread B ne peut attendre que le thread A pour terminer l'exécution (c'est-à-dire qu'il a changé le nom d'utilisateur et le mot de passe) avant d'exécuter MethodB pour lire le nom d'utilisateur et le mot de passe. Par conséquent, les problèmes de lecture sales causés par l'incohérence des données sont évités.
Ce qui précède concerne cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.