Table des matières
synchronisé
Avant-propos
Instance
méthode de synchronisation des threads
Bloc de synchronisation des threads
Raisons détaillées
Maison Java javaDidacticiel Qu'est-ce qui est synchronisé ? Comment utiliser la synchronisation ?

Qu'est-ce qui est synchronisé ? Comment utiliser la synchronisation ?

Jun 21, 2017 pm 01:27 PM
synchronized

synchronisé

Avant-propos

Je crois que tout le monde a entendu parler des problèmes de sécurité des threads lors de l'apprentissage des systèmes d'exploitation, un point de connaissance est les ressources critiques. Pour le dire simplement, seulement une ressource. cela permet à un processus de fonctionner, mais lorsque nous utilisons le multithreading, nous opérons simultanément et nous ne pouvons pas contrôler l'accès et la modification d'une seule ressource en même temps. Nous voulons contrôler plusieurs opérations aujourd'hui. à propos de la deuxième méthode One : Bloc de synchronisation de thread ou méthode de synchronisation de thread (synchronisée)

Instance

  1. Ce qui suit est un exemple pour illustrer le synchronized mot-clé Utilisez la

méthode de synchronisation des threads

public class Sychor {public void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
Copier après la connexion

où le résultat de sortie est comme indiqué ci-dessous

Quest-ce qui est synchronisé ? Comment utiliser la synchronisation ?

D'après les résultats ci-dessus, nous pouvons voir que les deux threads ici exécutent la méthode insert() en même temps. Ajoutons le synchronized. mot-clé au code original pour voir Quel est l'effet ? Le code est le suivant :

public class Sychor {public synchronized void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
Copier après la connexion

Je ne listerai pas les résultats en cours du programme ci-dessus. Vous pouvez l'essayer vous-même. En bref, j'ai ajouté synchronizedLe mot-clé provoque l'exécution des threads un par un. Ce n'est que lorsqu'un thread est exécuté en premier qu'un autre thread peut être exécuté.

Bloc de synchronisation des threads

Bien sûr, nous utilisons la méthode de synchronisation des threads ci-dessus, nous pouvons utiliser le bloc de synchronisation des threads, ces deux-là sont plus flexibles que le bloc de synchronisation des threads, il suffit de le mettre le code qui doit être synchronisé dans le bloc de synchronisation, le code est le suivant

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
            
        }
        

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
Copier après la connexion

Vous pouvez voir cette méthode à partir du code ci-dessus Plus flexible ; , il vous suffit de mettre les méthodes de code qui doivent être synchronisées dans le bloc de synchronisation, et le code qui n'a pas besoin d'être synchronisé à l'extérieur

Raisons détaillées

  1. Nous savons que chaque objet a un verrou Lorsque nous utilisons la méthode de synchronisation des threads ou le bloc de synchronisation des threads, nous obtenons en fait le seul verrou pour l'objet. , Ensuite, les autres threads ne peuvent être exclus que si nous disons ici qu'il s'agit d'un objet, ce qui signifie que c'est le même objet. S'il s'agit d'un objet différent, cela ne fonctionnera pas car différents objets ont des verrous d'objet différents. nous modifions le programme ci-dessus comme suit :

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
        }

    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor sychor = new Sychor();   //在run() 方法中创建一个对象sychor.insert(Thread.currentThread());
            };
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor sychor = new Sychor();  //创建另外的一个对象sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
Copier après la connexion

Il ressort des résultats ci-dessus que le bloc de synchronisation des threads fait n'existe pas du tout pour le moment. Cela fonctionne, car ils appellent la méthode d'insertion de différents objets, et l'obtention du verrou est différente

  1. <🎜. >Nous l'avons déjà dit ci-dessus. L'objet a un verrou. Les méthodes de synchronisation des threads et les blocs de synchronisation des threads obtiennent en fait le verrou de l'objet. Par conséquent, les parenthèses du bloc de synchronisation des threads sont remplies de

    . this dans une classe this

  1. Une classe a également un verrou unique Ce que nous avons dit plus tôt était. pour utiliser un objet pour appeler des méthodes membres. Maintenant, si nous appelons des méthodes statiques dans une classe, nous pouvons utiliser des méthodes de synchronisation de threads ou des blocs de synchronisation pour obtenir le seul verrou de la classe. Ensuite, nous pouvons contrôler plusieurs threads en appelant des méthodes statiques dans la classe. même classe en même temps. Le code est le suivant :

public class Sychor {// 静态方法public static synchronized void insert(Thread thread)  
    {for(int i=0;i<10;i++)
        {
            System.out.println(thread.getName()+"输出     "+i);
        }
    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());  //直接使用类调用静态方法};
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());   //直接使用类调用静态方法};
        };

        t1.start();
        t2.start();
    }
}
Copier après la connexion
Remarque

  1. Pour assurer la sécurité des threads et le contrôle de la synchronisation, si vous exécutez une méthode non

    synchronisée ou un bloc synchronisé, vous devez utiliser le même objet si vous appelez une méthode synchronisée statique ou un bloc synchronisé. il, vous devez utiliser la même classe pour appeler static

  1. Si un thread accède à la méthode synchronisée

    et qu'un autre thread accède à la méthode synchronisée non statique, les deux ne le seront pas. Il y a un conflit car l'un est un verrou de classe et l'autre est un verrou d'objet static

  1. Si vous utilisez un bloc de synchronisation de thread, alors dans le bloc de synchronisation Le code est à accès contrôlé, mais le code extérieur est accessible à tous les threads

  1. Lors de l'exécution d'un bloc de code synchronisé Si une exception se produit dans le thread, alors

    libérera automatiquement le verrou occupé par le thread actuel, il n'y aura donc pas de blocage dû à des exceptions jvm

Article de référence


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les principes et scénarios d'utilisation de Synchronized en Java et l'analyse de l'utilisation et des différences de l'interface Callable Les principes et scénarios d'utilisation de Synchronized en Java et l'analyse de l'utilisation et des différences de l'interface Callable Apr 21, 2023 am 08:04 AM

1. Fonctionnalités de base 1. Cela commence par un verrou optimiste, et si les conflits de verrouillage sont fréquents, il est converti en verrou pessimiste. 2. Cela commence par une implémentation de verrouillage légère, et si le verrou est maintenu pendant une longue période, il est activé. est converti en un verrou lourd. 3. La stratégie de verrouillage tournant qui est la plus probablement utilisée lors de l'implémentation de verrous légers 4. C'est un verrou injuste 5. C'est un verrou réentrant 6. Ce n'est pas un verrou en lecture-écriture 2. La JVM synchronisera le processus de verrouillage. Les verrous sont divisés en états sans verrouillage, verrouillage biaisé, verrouillage léger et verrouillage lourd. Il sera mis à niveau séquentiellement en fonction de la situation. Le verrouillage biaisé suppose que le protagoniste masculin est un verrou et que le protagoniste féminin est un fil. Si seulement ce fil utilise ce verrou, alors le protagoniste masculin et le protagoniste féminin peuvent vivre heureux pour toujours même s'ils n'obtiennent pas d'acte de mariage (en évitant les hauts). (opérations de coûts). Mais le second rôle féminin apparaît.

Principe de synchronisation des mots clés Java et exemple d'analyse de l'état du verrouillage Principe de synchronisation des mots clés Java et exemple d'analyse de l'état du verrouillage May 11, 2023 pm 03:25 PM

1. Le concept de verrou dans Java Spin lock : Lorsqu'un thread acquiert un verrou, si le verrou a été acquis par un autre thread, alors le thread attendra en boucle, puis continuera à juger si le verrou peut être acquis avec succès jusqu'à ce que il est acquis. Le verrou sortira de la boucle. Verrouillage optimiste : en supposant qu'il n'y ait pas de conflit, si les données s'avèrent incohérentes avec les données précédemment acquises lors de la modification des données, les dernières données seront lues et la modification sera réessayée. Verrouillage pessimiste : supposez que des conflits de concurrence se produiront, synchroniserez toutes les opérations liées aux données et commencerez le verrouillage à partir du moment où les données sont lues. Verrou exclusif (écriture) : ajoutez un verrou en écriture à la ressource. Le thread peut modifier la ressource, mais les autres threads ne peuvent pas la verrouiller à nouveau (écriture unique). Verrou partagé (lecture) : après avoir ajouté un verrou en lecture à une ressource, celui-ci peut uniquement être lu mais pas modifié. Les autres threads ne peuvent ajouter que des verrous en lecture et ne peuvent pas ajouter de verrous en écriture (plusieurs). Voir comme S

Comment utiliser synchronisé pour implémenter le mécanisme de synchronisation en Java ? Comment utiliser synchronisé pour implémenter le mécanisme de synchronisation en Java ? Apr 22, 2023 pm 02:46 PM

Résumé de l'utilisation de synchronisé en Java 1. Lorsque synchronisé est utilisé comme modificateur de fonction, l'exemple de code est le suivant : Publicsynchronizedvoidmethod(){//….} Il s'agit de la méthode de synchronisation. Alors, quel objet est synchronisé verrouillé à ce moment ? Ce qu'il verrouille appelle cet objet méthode synchronisée. En d'autres termes, lorsqu'un objet P1 exécute cette méthode de synchronisation dans différents threads, ils formeront une exclusion mutuelle pour obtenir un effet de synchronisation. Cependant, un autre objet P2 généré par la Classe à laquelle appartient cet objet peut arbitrairement appeler cette méthode en ajoutant le mot-clé synchronisé. L'exemple de code ci-dessus, etc.

Quelles sont les trois méthodes de synchronisation en Java et comment les utiliser ? Quelles sont les trois méthodes de synchronisation en Java et comment les utiliser ? Apr 27, 2023 am 09:34 AM

1. Expliquez que synchronisé est notre méthode de synchronisation la plus couramment utilisée et qu'il existe trois manières principales de l'utiliser. 2. Exemple//Synchronisation de méthode de classe générale synchroniséepublidvoidinvoke(){}//Synchronisation de méthode statique de classe synchroniséepublicstaticvoidinvoke(){}//Synchronisation de bloc de code synchronisé(objet){}La différence entre ces trois méthodes est que les objets synchronisés sont différents. Les classes ordinaires synchronisent l'objet lui-même, les méthodes statiques synchronisent la classe elle-même et les blocs de code synchronisent les objets que nous remplissons entre parenthèses. Quelles collections existe-t-il en Java ?

Quel est le principe et le processus de mise à niveau du verrouillage synchronisé Java ? Quel est le principe et le processus de mise à niveau du verrouillage synchronisé Java ? Apr 19, 2023 pm 10:22 PM

Préparation des outils Avant de parler formellement du principe de la synchronisation, parlons d'abord des verrous de rotation, car les verrous de rotation jouent un rôle important dans l'optimisation de la synchronisation. Pour comprendre les verrous de rotation, nous devons d’abord comprendre ce qu’est l’atomicité. Ce qu'on appelle l'atomicité signifie simplement que chaque opération n'est pas effectuée ou que tout faire signifie qu'elle ne peut pas être interrompue pendant l'opération. Par exemple, pour en ajouter une aux données variables, il y a les trois étapes suivantes : ajouter des données Charger. de la mémoire dans le registre. Ajoutez-en un à la valeur des données. Écrivez le résultat en mémoire. L'atomicité signifie que lorsqu'un thread effectue une opération d'incrémentation, il ne peut pas être interrompu par d'autres threads uniquement lorsque ce thread termine ces trois processus.

Pourquoi Java doit-il fournir Lock au lieu d'utiliser simplement le mot-clé synchronisé ? Pourquoi Java doit-il fournir Lock au lieu d'utiliser simplement le mot-clé synchronisé ? Apr 20, 2023 pm 05:01 PM

Résumé : Le mot clé synchronisé est fourni en Java pour garantir qu'un seul thread peut accéder au bloc de code synchronisé. Puisque le mot-clé synchronisé a été fourni, pourquoi l'interface Lock est-elle également fournie dans le package Java SDK ? Est-ce une réinvention inutile de la roue ? Aujourd’hui, nous discuterons ensemble de cette question. Le mot-clé synchronisé est fourni en Java pour garantir qu'un seul thread peut accéder au bloc de code synchronisé. Puisque le mot-clé synchronisé a été fourni, pourquoi l'interface Lock est-elle également fournie dans le package Java SDK ? Est-ce une réinvention inutile de la roue ? Aujourd’hui, parlons-en ensemble

Qu'est-ce que Java synchronisé Qu'est-ce que Java synchronisé May 14, 2023 am 08:28 AM

Qu'est-ce que Synchronized ? Les lecteurs Java ne sont pas étrangers au mot-clé synchronisé. Il peut être vu dans divers codes sources de middleware ou de codes sources du JDK. Pour les lecteurs qui ne sont pas familiers avec synchronisé, ils savent seulement que le mot-clé synchronisé doit être utilisé en multi. -le threading synchronisé peut assurer la sécurité des threads. On l'appelle : verrouillage mutex (un seul thread peut s'exécuter en même temps, les autres threads attendront), également appelé : verrouillage pessimiste (un seul thread peut s'exécuter en même temps, les autres threads attendront). vous aider à l'implémenter, les développeurs n'ont qu'à utiliser le mot-clé synchronisé. Lors de son utilisation, vous devez utiliser un objet comme mutex pour le verrou

Combien de modificateurs de non-accès existe-t-il en Java ? Combien de modificateurs de non-accès existe-t-il en Java ? Aug 30, 2023 pm 06:01 PM

Java fournit d'autres modificateurs pour fournir des fonctionnalités au-delà de la visibilité. Ces modificateurs sont appelés modificateurs de non-accès. Les membres déclarés comme statiques sont communs à toutes les instances de la classe. Les membres statiques sont des membres de niveau classe stockés dans la mémoire de classe. Final Ce modificateur est utilisé pour restreindre d'autres modifications à une variable, une méthode ou une classe. La valeur d'une variable déclarée finale ne peut plus être modifiée une fois qu'elle a obtenu sa valeur. La méthode Final ne peut pas être substituée dans une sous-classe, et une sous-classe de la classe Final ne peut pas non plus être créée. Résumé Ce modificateur peut être utilisé avec une classe ou une méthode. Vous ne pouvez pas appliquer ce modificateur aux variables et aux constructeurs. Les méthodes déclarées abstraites doivent être modifiées dans les sous-classes. Vous ne pouvez pas instancier une classe déclarée abstraite. Synchrone Ce modificateur est utilisé pour contrôler plusieurs threads

See all articles