Mécanisme de synchronisation des threads et d'exclusion mutuelle en Java
En Java, le multi-threading est une technologie importante. Pour exécuter efficacement plusieurs tâches simultanément, vous devez maîtriser les mécanismes de synchronisation et de coopération entre les threads. Cet article présentera le mécanisme de synchronisation des threads et d'exclusion mutuelle en Java.
La synchronisation des threads signifie que plusieurs threads coopèrent pour accomplir des tâches spécifiées pendant l'exécution. Les segments de code exécutés par plusieurs threads accèdent mutuellement aux ressources partagées. Une fois qu'un segment de code est exécuté, un seul thread peut accéder aux ressources partagées et les autres threads doivent attendre. La synchronisation des threads suit les principes de base suivants :
(1) Atomicité : un certain morceau de code n'est accessible que par un seul thread à la fois.
(2) Réentrance : lorsqu'un thread exécute plusieurs fois un bloc synchronisé, il ne sera pas verrouillé car il détient déjà le verrou.
En Java, il existe deux façons de maintenir la synchronisation, à savoir synchronisé et verrouillé.
1.1 synchronisé
synchronisé est le mécanisme de synchronisation le plus basique en Java. Le format du bloc de synchronisation synchronisée est le suivant :
synchronisé (objet) {
//Segment de code
}
Parmi eux, l'objet est une ressource partagée qui doit être synchronisée, comme la méthode de l'objet ou l'objet lui-même. Un seul thread peut accéder au bloc de code modifié par le mot-clé synchronisé à la fois. Par exemple :
public synchronisé void method(){
//代码
}
Dans l'exemple de code ci-dessus, la méthode method() est modifiée avec le mot-clé synchronisé, et un seul thread peut exécuter cette méthode en même temps. En multi-threading, on peut garantir que les threads accédant à cette méthode sont synchronisés.
1.2 Lock
Le mécanisme de verrouillage offre un contrôle de verrouillage plus précis. Lock est une interface en Java, implémentée via ReentrantLock, une sous-classe de l'interface Lock. L'utilisation des verrous Lock est quelque peu similaire au mot-clé synchronisé, mais son utilisation est plus flexible. Lors de l'utilisation du mécanisme de verrouillage, les segments de code qui doivent acquérir et libérer le verrou sont inclus dans les blocs de code try et finalement. Par exemple :
Lock lock = new ReentrantLock();
lock.lock();
try {
//代码段
} enfin {
lock.unlock();
}
Dans le code ci-dessus, la méthode lock() est utilisée pour verrouiller le ressource partagée. Utilisation La méthode unlock() libère le verrou. Étant donné que le mécanisme de verrouillage offre un contrôle de verrouillage plus fin, il est plus adapté à certaines situations de haute performance.
Le mécanisme d'exclusion mutuelle consiste à garantir qu'un seul thread peut accéder aux ressources partagées en même temps lors d'une exécution multithread. En Java, il existe deux manières d'implémenter le mécanisme d'exclusion mutuelle, à savoir synchronisé et verrouillé.
2.1 synchronisé
Le bloc synchronisé synchronisé peut non seulement réaliser la synchronisation des threads, mais également implémenter un mécanisme d'exclusion mutuelle. L'exemple de code d'utilisation de synchronisé pour implémenter le mécanisme d'exclusion mutuelle est le suivant :
public synchronisé void method(){
//代码段
}
Dans le code ci-dessus, le mot-clé de synchronisation synchronisée est ajouté avant la méthode, ce qui garantit qu'à en même temps, un seul thread peut accéder à ce code, implémentant ainsi un mécanisme d'exclusion mutuelle.
2.2 Lock
En utilisant le mécanisme d'exclusion mutuelle fourni dans la bibliothèque LockAPI, le mécanisme d'exclusion mutuelle peut également être implémenté. L'exemple de code d'utilisation du mécanisme Lock pour implémenter le mécanisme d'exclusion mutuelle est le suivant :
private final Lock lock = new ReentrantLock();
public void method() {
lock.lock(); try { //代码段 } finally { lock.unlock(); }
}
Dans le code ci-dessus, le verrou () est utilisée pour verrouiller les ressources partagées, utilisez la méthode unlock() pour libérer le verrou, réalisant ainsi le mécanisme d'exclusion mutuelle.
Le bloc synchronisé synchronisé et le mécanisme de verrouillage peuvent tous deux implémenter des mécanismes de synchronisation des threads et d'exclusion mutuelle, mais il existe quelques différences entre les deux.
(1) Granularité différente : le bloc de synchronisation synchronisé a une granularité plus grande, tandis que le mécanisme de verrouillage fournit une granularité plus petite via l'interface de verrouillage. Vous pouvez utiliser le mécanisme de verrouillage pour définir des verrous plus personnalisés, et en même temps, vous pouvez contrôler. le déverrouillage de la serrure.
(2) Visibilité différente : lors de l'utilisation d'un bloc de synchronisation synchronisée, lorsqu'un thread possède le verrou, l'autre thread ne peut pas voir le verrou, il ne peut donc pas contrôler la libération du verrou indépendamment. Grâce au mécanisme Lock, lorsqu'un thread acquiert le verrou, le verrou est visible par tous les threads et peut contrôler la libération du verrou.
Pour résumer, le mécanisme de synchronisation des threads et d'exclusion mutuelle en Java est un mécanisme très important dans la programmation multithread. Différents scénarios d'application nécessitent l'utilisation de différents mécanismes de synchronisation et d'exclusion mutuelle. Le choix du mécanisme approprié peut considérablement améliorer l'efficacité d'exécution des applications multithread.
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!