Utilisation du mot-clé synchronisé
Le mot-clé synchronisé est un verrou de synchronisation couramment utilisé dans la programmation simultanée Java. Il est utilisé pour verrouiller des méthodes ou des blocs de code, il peut être synchronisé(this){}, synchronisé(Object){}. (classe) {}.
Le verrou sera automatiquement libéré lorsque le contenu verrouillé est exécuté ou qu'une exception est levée pendant l'exécution.
Si vous souhaitez libérer manuellement le verrou, vous devez appeler la méthode wait() de l'objet verrouillé pour libérer le verrou et le mettre dans un état d'attente, passer à d'autres threads à exécuter et la notification () réveille uniquement l'objet qui a été appelé. Méthode wait() d'autres threads, mais le verrou ne sera pas libéré et l'ordre de sélection n'est pas contrôlé par le code et est implémenté par la machine virtuelle.
Par conséquent, les méthodes wait(), notify() et notifyAll() de l'objet ne peuvent être utilisées qu'avec le mot-clé synchronisé pour terminer la planification entre les threads.
où la méthode verrouillée équivaut à synchronisé(this){tout le code de la méthode sous forme de bloc de code}, comme suit :
public synchronized void test() { ... }
est équivalent à
public void test() { synchronized (this) { ... } }
verrouillé dans l'exemple ci-dessus est un objet de cette classe. Si une méthode statique est verrouillée, on sait que la méthode statique appartient à la classe et non à l'objet. Par conséquent, la méthode statique modifiée par synchronisé verrouille tous les objets de cette classe, c'est à dire. Autrement dit, même deux objets Instance, tant qu'ils appartiennent à cette classe, seront verrouillés.
public synchronized static void test() { ... }
équivaut à
public static void test() { synchronized (所在类.class) { ... } }
Qu'il s'agisse d'une méthode de verrouillage ou d'un bloc de code, quel que soit l'objet de référence lors du verrouillage du bloc de code, c'est clair tant que vous vous en souvenez principe, c'est-à-dire lorsque les verrous de synchronisation de l'objet de référence ne fonctionnent que lorsqu'ils sont identiques, sinon les verrous ne s'excluent pas mutuellement et peuvent être exécutés simultanément.
synchronized(this) indique que le verrouillage prend effet lorsque les instances d'objet de la classe actuelle sont les mêmes, synchronisé(Object) indique que le verrouillage prend effet lorsque les objets Object sont les mêmes, et synchronisé(classe ) indique que le verrouillage prend effet lorsqu'ils sont tous de la même classe.
Donnez un exemple simple :
public class TestController { public class Task implements Runnable{ private String str; Task(String str){ this.str=str; } @Override public void run() { synchronized (str) { try { Thread.sleep(3000l); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(str); } } } public static void main(String[] args) throws InterruptedException { TestController testController = new TestController(); Thread thread1 = new Thread(testController.new Task("1")); Thread thread2 = new Thread(testController.new Task("1")); thread1.start(); thread2.start(); } }
Dans le code ci-dessus, l'objet de référence str est entièrement "1". En Java, si la chaîne String passe this.str="1", Assignment. est équivalent à str=String.valueOf("1") Si la chaîne "1" a été initialisée auparavant, la précédente sera prise directement, c'est donc le même objet. Selon le principe introduit ci-dessus, le verrouillage prendra effet, le résultat est donc que 1 sera émis après 3 secondes et 1 sera émis après 3 secondes supplémentaires.
Si thread2 est remplacé par
Thread thread2 = new Thread(testController.new Task("2"));
alors l'un des objets de référence est "1" et l'autre est "2", qui ne sont pas le même objet, donc le verrou ne sera pas mutuellement exclusive fonctionne, donc le résultat est que 1 et 2 sont émis presque simultanément après 3 secondes.
Tous les éléments ci-dessus sont plusieurs threads appelant la même méthode en même temps. Que se passe-t-il si différentes méthodes sont appelées ?
public class Test{ public synchronized void m1(){ System.out.println("m1 running..."); try { Thread.sleep(3000l); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("m1 end"); } public synchronized void m2(){ System.out.println("m2 running..."); System.out.println("m2 end"); } public static void main(String[] args) { Test test = new Test(); new Thread(new Runnable() { @Override public void run() { test.m1(); } }).start(); new Thread(new Runnable() { @Override public void run() { test.m2(); } }).start(); } }
Le résultat de sortie du code ci-dessus est :
m1 running... //过3秒 m1 end m2 running... m2 end
Comme mentionné ci-dessus, la modification synchronisée équivaut à synchronisé(this) {tout le code de la méthode sous forme de bloc de code}, et ceci représente est un objet, c'est-à-dire que le premier Thread obtient le verrou de l'objet de test Parce que les objets sont tous le même test, le deuxième Thread ne peut pas obtenir le verrou et est bloqué.
Changez l'exemple ci-dessus comme suit :
private String str = "1"; public void m1(){ synchronized(str){ System.out.println("m1 running..."); try { Thread.sleep(3000l); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("m1 end"); } } public void m2(){ synchronized(str){ System.out.println("m2 running..."); System.out.println("m2 end"); } }
Lorsque le premier Thread appelle m1(), il obtient le verrou de l'objet str. Le deuxième Thread en a également besoin lorsqu'il appelle m2(. ). Obtenez le verrou de l'objet str, et comme ce sont le même objet Test, les deux str sont également le même objet, donc le deuxième Thread sera bloqué car il ne peut pas obtenir le verrou, et le résultat de sortie est le même que l'exemple précédent.
Si vous remplacez l'exemple ci-dessus par celui-ci :
public class M1 { public void m(String str){ synchronized (str) { System.out.println("m1 runing"); try { Thread.sleep(3000l); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("m1 end"); } } } public class M2 { public void m(String str){ synchronized (str) { System.out.println("m2 runing"); System.out.println("m2 end"); } } } public class Test { public static void main(String[] args) { String str = "1"; new Thread(new Runnable() { @Override public void run() { new M1().m(str); } }).start(); new Thread(new Runnable() { @Override public void run() { new M2().m(str); } }).start(); } }
La méthode appelée cette fois est en deux classes, mais le résultat est le même que les deux exemples précédents, car les verrouillés Ils sont tous les objets str transmis. Il n'y a qu'un seul verrou pour le même objet Si le premier Thread le prend, le deuxième Thread ne peut qu'attendre.
Résumé :
A. Que le mot-clé synchronisé soit ajouté à une méthode ou à un objet, si l'objet sur lequel il agit est non statique, le verrou est activé. il acquiert est l'objet ; Si l'objet sur lequel la synchronisation agit est une méthode statique ou une classe, le verrou qu'il acquiert est pour la classe, et tous les objets de la classe ont le même verrou.
B. Chaque objet n'est associé qu'à un seul verrou. Celui qui obtient ce verrou peut exécuter le code qu'il contrôle.
C. La mise en œuvre de la synchronisation nécessite beaucoup de temps système et peut même provoquer un blocage, alors essayez d'éviter un contrôle de synchronisation inutile
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds





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.

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

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.

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 ?

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.

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 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

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
