Krótkie podsumowanie:
Semaphore
i CountDownLatch
służy różnym celom.
Służy Semaphore
do kontrolowania dostępu wątków do zasobu.
Służy CountDownLatch
do czekania na zakończenie wszystkich wątków
Semaphore
definicja z Javadocs:
A Semaphore
utrzymuje zestaw zezwoleń. Każdy acquire()
blokuje się, jeśli to konieczne, aż do uzyskania zezwolenia , a następnie je przyjmuje. Każdy release()
dodaje zezwolenie, potencjalnie zwalniając blokującego nabywcę.
Jednak żadne rzeczywiste obiekty zezwoleń nie są używane; po Semaphore
prostu liczy dostępną liczbę i działa odpowiednio.
Jak to działa?
Semafory są używane do kontrolowania liczby współbieżnych wątków, które używają zasobu. Może to być coś w rodzaju udostępnionych danych, blok kodu ( sekcja krytyczna ) lub dowolny plik.
Liczba na a Semaphore
może rosnąć i maleć, gdy różne wątki wywołują acquire()
i release()
. Ale w dowolnym momencie nie możesz mieć większej liczby wątków niż liczba semaforów.
Semaphore
Przypadków użycia:
- Ograniczenie równoczesnego dostępu do dysku (może to spowodować utratę wydajności z powodu wyszukiwania konkurencyjnych dysków)
- Ograniczenie tworzenia wątków
- Buforowanie / ograniczanie połączeń JDBC
- Ograniczanie przepustowości połączenia sieciowego
- Dławienie zadań intensywnie wykorzystujących procesor lub pamięć
Zapoznaj się z tym artykułem dotyczącym zastosowań semaforów.
CountDownLatch
definicja z Javadocs:
Pomoc w synchronizacji, która pozwala jednemu lub większej liczbie wątków czekać na zakończenie zestawu operacji wykonywanych w innych wątkach.
Jak to działa?
CountDownLatch
działa poprzez zainicjowanie licznika liczbą wątków, która jest zmniejszana za każdym razem, gdy wątek kończy wykonywanie. Gdy liczba osiągnie zero, oznacza to, że wszystkie wątki zakończyły wykonywanie, a wątek oczekujący na zatrzask wznawia wykonywanie.
CountDownLatch
Przypadków użycia:
- Osiągnięcie maksymalnego równoległości: Czasami chcemy rozpocząć kilka wątków w tym samym czasie, aby osiągnąć maksymalną równoległość
- Poczekaj na zakończenie N wątków przed rozpoczęciem wykonywania
- Wykrywanie zakleszczenia.
Zapoznaj się z tym artykułem, aby dobrze zrozumieć CountDownLatch
pojęcia.
Zajrzyj też do Fork Join Pool w tym artykule . Ma pewne podobieństwa do CountDownLatch
.