Pequeno resumo:
Semaphore e CountDownLatch têm uma finalidade diferente.
Use o Semaphore para controlar o acesso do thread ao recurso.
Use CountDownLatch para aguardar a conclusão de todos os threads
Definição de semáforo de javadocs:
Um Semaphore mantém um conjunto de licenças. Cada aquisição () bloqueia se necessário até que uma licença esteja disponível e, em seguida, a aceita. Cada release () adiciona uma licença, potencialmente liberando um adquirente de bloqueio.
No entanto, nenhum objeto de licença real é usado; o Semaphore apenas mantém uma contagem do número disponível e age de acordo.
Como funciona ?
Os semáforos são usados para controlar o número de threads simultâneos que estão usando um recurso. Esse recurso pode ser algo como dados compartilhados, ou um bloco de código ( seção crítica ) ou qualquer arquivo.
A contagem em um semáforo pode aumentar e diminuir conforme diferentes threads chamam acquire
() e release
(). Mas, em qualquer ponto do tempo, você não pode ter mais número de threads maior do que a contagem do Semaphore.
Casos de uso de semáforo:
- Limitar o acesso simultâneo ao disco (isso pode prejudicar o desempenho devido a buscas de disco concorrentes)
- Limitação de criação de linha
- Pooling / limitação de conexão JDBC
- Limitação de conexão de rede
- Controle de fluxo de CPU ou tarefas intensivas de memória
Dê uma olhada neste artigo para usos de semáforo.
Definição CountDownLatch de javadocs:
Um auxílio de sincronização que permite que um ou mais encadeamentos aguardem até que um conjunto de operações sendo realizadas em outros encadeamentos seja concluído.
Como funciona?
CountDownLatch funciona tendo um contador inicializado com número de threads, que é diminuído cada vez que uma thread completa sua execução. Quando a contagem chega a zero, significa que todos os encadeamentos concluíram sua execução e o encadeamento em espera retoma a execução.
Casos de uso CountDownLatch:
- Atingindo o paralelismo máximo: às vezes, queremos iniciar vários threads ao mesmo tempo para atingir o paralelismo máximo
- Aguarde N threads para concluir antes de iniciar a execução
- Detecção de deadlock.
Dê uma olhada neste artigo para entender os conceitos de CountDownLatch claramente.
Dê uma olhada em Fork Join Pool neste artigo também. Ele tem algumas semelhanças com CountDownLatch .