Breve resumen:
Semaphore y CountDownLatch tienen un propósito diferente.
Utilice Semaphore para controlar el acceso del hilo al recurso.
Utilice CountDownLatch para esperar la finalización de todos los hilos
Definición de semáforo de javadocs:
Un semáforo mantiene un conjunto de permisos. Cada uno adquiere () bloquea si es necesario hasta que haya un permiso disponible y luego lo toma. Cada versión () agrega un permiso, lo que potencialmente libera a un adquirente bloqueante.
Sin embargo, no se utilizan objetos de permiso reales; el semáforo solo lleva un recuento del número disponible y actúa en consecuencia.
Como funciona ?
Los semáforos se utilizan para controlar la cantidad de subprocesos simultáneos que están usando un recurso. Ese recurso puede ser algo así como un dato compartido, un bloque de código ( sección crítica ) o cualquier archivo.
El recuento de un semáforo puede subir y bajar a medida que diferentes hilos llaman acquire
() y release
(). Pero en cualquier momento, no puede tener más subprocesos que el recuento de semáforos.
Casos de uso de semáforos:
- Limitar el acceso simultáneo al disco (esto puede matar el rendimiento debido a búsquedas de disco en competencia)
- Limitación de la creación de hilos
- Agrupación / limitación de conexiones JDBC
- Limitación de la conexión de red
- Limitación de tareas intensivas en memoria o CPU
Eche un vistazo a este artículo para conocer los usos de los semáforos.
CountDownLatch definición de javadocs:
Una ayuda de sincronización que permite que uno o más subprocesos esperen hasta que se complete un conjunto de operaciones que se están realizando en otros subprocesos.
¿Como funciona?
CountDownLatch funciona al tener un contador inicializado con el número de subprocesos, que se reduce cada vez que un subproceso completa su ejecución. Cuando el recuento llega a cero, significa que todos los subprocesos han completado su ejecución y el subproceso que espera en el pestillo reanuda la ejecución.
Casos de uso de CountDownLatch:
- Lograr el máximo paralelismo: a veces queremos iniciar una serie de subprocesos al mismo tiempo para lograr el máximo paralelismo
- Espere N subprocesos para completar antes de iniciar la ejecución
- Detección de interbloqueo.
Eche un vistazo a este artículo para comprender claramente los conceptos de CountDownLatch.
Eche un vistazo a Fork Join Pool en este artículo también. Tiene algunas similitudes con CountDownLatch .