Lorsque vous utilisez le mot-clé synchronisé, un mutex est utilisé pour garantir la sécurité des threads et l'accès synchrone aux ressources partagées. Une exécution plus coordonnée entre les threads est souvent nécessaire pour effectuer des tâches simultanées complexes. Par exemple, le mode attendre/notifier est un mécanisme d'exécution coordonné dans un environnement multithread.
L'acquisition et la libération de verrous via l'API (à l'aide d'un mutex) ou l'appel de wait/notify et d'autres méthodes sont toutes des méthodes d'appel de bas niveau. De plus, il est nécessaire de créer des abstractions de niveau supérieur pour la synchronisation des threads. La classe auxiliaire de synchronisation couramment utilisée consiste à encapsuler davantage le mécanisme d'activité de synchronisation entre deux ou plusieurs threads. Son principe interne est d'obtenir une coordination complexe entre les threads en utilisant l'API sous-jacente existante.
Il existe 5 classes d'assistance à la synchronisation adaptées aux scénarios de synchronisation courants :
1. Sémaphore Sémaphore est un outil de synchronisation classique. Les sémaphores sont souvent utilisés pour limiter le nombre de ressources (physiques ou logiques) auxquelles un thread peut accéder simultanément.
2.CountDownLatch est une classe auxiliaire de synchronisation très simple mais couramment utilisée. Son objectif est de permettre à un ou plusieurs threads de se bloquer jusqu'à ce qu'un ensemble d'opérations effectuées dans d'autres threads soit terminé.
3. CyclicBarrier est un point de synchronisation multidirectionnel réinitialisable qui est utile dans certains scénarios de programmation simultanée. Il permet à un groupe de threads de s'attendre jusqu'à ce qu'un point de barrière commun soit atteint. CyclicBarrier est utile dans les programmes impliquant un ensemble de threads de taille fixe qui doivent s'attendre de temps en temps. Étant donné que la barrière peut être réutilisée une fois le thread en attente libéré, on l'appelle une barrière cyclique.
4. Phaser est une barrière de synchronisation réutilisable dont la fonction est similaire à CyclicBarrier et CountDownLatch, mais dont l'utilisation est plus flexible. Il est très approprié pour coordonner de manière synchrone des tâches informatiques par étapes dans un environnement multithread (lorsque la synchronisation est requise entre les sous-tâches dans le framework Fork/Join, Phaser est préféré)
5.Exchanger permet à deux threads d'échanger des objets à un certain point de rencontre, ce qui est plus utile dans certaines conceptions de pipeline. Exchanger fournit un point de synchronisation auquel une paire de threads peut échanger des données. Chaque thread fournit des données à son thread partenaire via l'entrée de la méthode Exchange(), reçoit les données fournies par son thread partenaire et les renvoie. Lorsque deux threads échangent des objets via Exchanger, l'échange est sécurisé pour les deux threads. Exchanger peut être considéré comme une forme bidirectionnelle de SynchronousQueue, qui est plus utile dans les applications impliquant des algorithmes génétiques et la conception de pipelines.