


Introduction à l'utilisation du mot-clé synchronisé en Java (exemple de code)
Cet article vous apporte une introduction à l'utilisation du mot-clé synchronisé en Java (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent le faire pour référence, j'espère. cela vous sera utile.
En programmation concurrente, le mot-clé synchronisé est un rôle courant. Nous avions l'habitude d'appeler le verrou de poids du mot-clé synchronisé, mais synchronisé a été optimisé dans JDK1.6 et des verrous biaisés et des verrous légers ont été introduits. Cet article présente comment utiliser le mot-clé synchronisé, les différences et les principes de mise en œuvre des verrous biaisés, des verrous légers et des verrous lourds.
Regardons d'abord les 4 utilisations du mot-clé synchronisé.
1. Modifier les méthodes ordinaires
private synchronized void synMethod(){ }
Cette utilisation, l'instance d'objet du verrou synchronisé.
2. Modifier les méthodes statiques
private static synchronized void synMethod(){ }
synchronisées dans ce cas, le lock est l'objet Class actuel.
3. Bloc de méthode synchronisé
private void synMethod1(){ synchronized(this){ } } private void synMethod2(){ synchronized(ThreadTest.class){ } }
Verrouiller l'instance d'objet dans synMethod1 ; synMethod2 est l'objet Class actuel.
Réintroduire le principe du verrouillage
Avant d'introduire le principe du verrouillage, commençons par connaître l'en-tête de l'objet Java Mark Word, en prenant 32 bits à titre d'exemple.
État de verrouillage |
25 bits |
4 bits |
1 bit |
2 bits |
||
|
23 bits |
2 bits |
S'il est biaisé en faveur du verrouillage |
Drapeau de verrouillage |
||
Verrouillage léger |
Pointeur vers l'enregistrement de verrouillage dans la pile |
0 |
||||
Verrouillage lourd |
Pointeur vers mutex (verrouillage lourd) |
10 |
||||
GCMarque |
Vide |
11 |
||||
Verrouillage de biais |
ThreadID |
Époque | Âge de génération d'objet |
1 |
01 |
|
Sans verrouillage |
hashCode de l'objet | Âge de génération d'objet |
0 |
01 |
Le tableau ci-dessus décrit les informations stockées dans l'en-tête de l'objet lorsque l'objet est dans chaque état de verrouillage.
1. Verrouillage biaisé
Dans l'environnement réel, lorsqu'un thread accède à un bloc synchronisé, si aucun autre thread n'est en compétition pour le verrou, et Le même thread acquiert le verrou plusieurs fois, c'est-à-dire qu'un seul thread exécute le code de synchronisation. Dans ce cas, si le thread est bloqué à chaque fois, cela signifie un gaspillage des performances du processeur. Dans ce cas, la notion de verrouillage biaisé est introduite.
Accéder au bloc de code synchronisé
Déterminez si l'ID de thread stocké dans l'en-tête de l'objet Mark Word pointe vers le thread actuel. Si tel est le cas, cela indique que le verrou actuel est réentrant. Il n'est pas nécessaire d'obtenir le verrou et d'exécuter directement la synchronisation. code
Sinon, essayez d'utiliser l'algorithme CAS pour mettre à jour l'ID du fil dans l'en-tête de l'objet.
Obtient avec succès le verrou et exécute le code de synchronisation. L'échec de la mise à jour indique qu'il existe une concurrence de verrouillage. Attendez le point de sécurité global, suspendez le thread qui possède le verrou biaisé et choisissez de mettre à niveau le verrou biaisé vers un verrou léger ou de le définir sur aucun verrou en fonction de l'indicateur de verrouillage dans le fichier. en-tête d'objet.
Vous pouvez utiliser -XX:-userBiasedLocking=false pour désactiver l'optimisation du verrouillage biaisé JVM et entrer le verrouillage léger directement par défaut.
2. Verrouillage léger
Bloc de code de synchronisation d'accès , créez d'abord une zone d'enregistrement de verrouillage (Lock Record) dans la pile de threads du thread actuel.
Copiez l'en-tête de l'objet Mark Word dans l'enregistrement de verrouillage.
Utilisez CAS pour essayer de mettre à jour le pointeur de fil de discussion dans l'en-tête de l'objet Marquez Word vers un pointeur vers le fil de discussion actuel
Si la mise à jour est réussi, vous obtiendrez un verrou léger.
La mise à jour a échoué, vérifiez si le pointeur dans Mark Word pointe vers le fil de discussion actuel.
Si oui, cela signifie la réentrée du verrouillage. Exécuter le bloc de code synchronisé
Sinon, cela signifie qu'il y a de la concurrence en ce moment. Les verrous légers doivent être étendus aux verrous de poids.
3. Verrouillage du poids
Le verrouillage du poids est implémenté en fonction du moniteur d'objet (Moniteur).
Lorsqu'un thread exécute du code de synchronisation, il doit appeler une instruction Monitor.enter. Une fois l’exécution terminée, appelez l’instruction Monitor.exit. On peut voir ici que le moniteur est exclusif. Un seul thread peut entrer avec succès à un moment donné, et les autres threads ne peuvent être bloqués que dans la file d'attente. Ce verrou à poids est donc très coûteux à exploiter.
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

AI Hentai Generator
Générez AI Hentai gratuitement.

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)

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
