Cuando utiliza la palabra clave sincronizada, se utiliza un mutex para garantizar la seguridad de los subprocesos y el acceso sincrónico a los recursos compartidos. A menudo se requiere una mayor ejecución coordinada entre subprocesos para completar tareas concurrentes complejas. Por ejemplo, el modo de espera/notificación es un mecanismo de ejecución coordinada en un entorno de subprocesos múltiples.
Adquirir y liberar bloqueos a través de la API (usando un mutex) o llamar a esperar/notificar y otros métodos son todos métodos de llamada de bajo nivel. Además, es necesario crear abstracciones de nivel superior para la sincronización de subprocesos. La clase auxiliar de sincronización comúnmente utilizada es encapsular aún más el mecanismo de actividad de sincronización entre dos o más subprocesos. Su principio interno es lograr una coordinación compleja entre subprocesos mediante el uso de la API subyacente existente.
Hay cinco clases de ayuda de sincronización adecuadas para escenarios de sincronización comunes:
1. Semaphore Semaphore es una herramienta de sincronización clásica. Los semáforos se utilizan a menudo para limitar la cantidad de recursos (físicos o lógicos) a los que un hilo puede acceder simultáneamente.
2.CountDownLatch es una clase auxiliar de sincronización muy simple pero de uso común. Su propósito es permitir que uno o más subprocesos se bloqueen hasta que se complete un conjunto de operaciones que se realizan en otros subprocesos.
3. CyclicBarrier es un punto de sincronización multidireccional reiniciable que resulta útil en determinados escenarios de programación concurrente. Permite que un grupo de subprocesos se esperen unos a otros hasta que se alcanza un punto de barrera común. CyclicBarrier es útil en programas que involucran un conjunto de subprocesos de tamaño fijo que deben esperarse entre sí de vez en cuando. Debido a que la barrera se puede reutilizar después de que se libera el hilo en espera, se denomina barrera cíclica.
4. Phaser es una barrera de sincronización reutilizable que tiene una función similar a CyclicBarrier y CountDownLatch, pero su uso es más flexible. Es muy adecuado para coordinar sincrónicamente tareas informáticas en fases en un entorno de subprocesos múltiples (cuando se requiere sincronización entre subtareas en el marco Fork/Join, se prefiere Phaser)
5.Exchanger permite que dos subprocesos intercambien objetos en un determinado punto de encuentro, lo cual es más útil en ciertos diseños de tuberías. Exchanger proporciona un punto de sincronización en el que un par de subprocesos pueden intercambiar datos. Cada hilo proporciona datos a su hilo asociado a través de la entrada del método exchange(), recibe los datos proporcionados por su hilo asociado y los devuelve. Cuando dos subprocesos intercambian objetos a través de Exchanger, el intercambio es seguro para ambos subprocesos. Exchanger puede considerarse como una forma bidireccional de SynchronousQueue, que es más útil en aplicaciones que involucran algoritmos genéticos y diseño de tuberías.