Breve riassunto:
Semaphore e CountDownLatch hanno uno scopo diverso.
Usa Semaphore per controllare l'accesso del thread alla risorsa.
Usa CountDownLatch per attendere il completamento di tutti i thread
Definizione di semaforo da javadocs:
Un semaforo mantiene una serie di permessi. Ogni acquisizione () si blocca se necessario fino a quando non è disponibile un permesso , quindi lo prende. Ogni release () aggiunge un permesso, potenzialmente rilasciando un acquirente che blocca.
Tuttavia, non viene utilizzato alcun oggetto permesso effettivo; il semaforo tiene solo un conteggio del numero disponibile e agisce di conseguenza.
Come funziona ?
I semafori vengono utilizzati per controllare il numero di thread simultanei che utilizzano una risorsa, che può essere qualcosa come un dato condiviso o un blocco di codice ( sezione critica ) o qualsiasi file.
Il conteggio su un semaforo può aumentare e diminuire quando diversi thread chiamano acquire
() e release
(). Ma in qualsiasi momento, non puoi avere un numero di thread maggiore del conteggio dei semafori.
Casi d'uso del semaforo:
- Limitazione dell'accesso simultaneo al disco (questo può ridurre le prestazioni a causa di ricerche su disco concorrenti)
- Limitazione della creazione di thread
- Pooling / limitazione della connessione JDBC
- Limitazione della connessione di rete
- Limitazione della CPU o attività ad alta intensità di memoria
Dai un'occhiata a questo articolo per gli usi del semaforo.
Definizione CountDownLatch da javadocs:
Un aiuto per la sincronizzazione che consente a uno o più thread di attendere fino al completamento di una serie di operazioni eseguite in altri thread.
Come funziona?
CountDownLatch funziona avendo un contatore inizializzato con il numero di thread, che viene decrementato ogni volta che un thread completa la sua esecuzione. Quando il conteggio arriva a zero, significa che tutti i thread hanno completato la loro esecuzione e il thread in attesa di latch riprende l'esecuzione.
CountDownLatch Casi d'uso:
- Ottenere il massimo parallelismo: a volte si desidera avviare più thread contemporaneamente per ottenere il massimo parallelismo
- Attendi il completamento di N thread prima di avviare l'esecuzione
- Rilevamento deadlock.
Dai un'occhiata a questo articolo per comprendere chiaramente i concetti di CountDownLatch.
Dai un'occhiata anche a Fork Join Pool in questo articolo . Ha alcune somiglianze con CountDownLatch .