Gpt 정보 - 100% 신뢰 할 수 없는 정보 / 기본 정보만 확인
CountDownLatch
CountDownLatch는 Java에서 스레드 동기화를 위해 사용되는 유틸리티 클래스입니다. java.util.concurrent 패키지에 포함되어 있으며, 특정 작업들이 완료될 때까지 기다리도록 다른 스레드를 블로킹하는 용도로 사용됩니다.
✅ 기본 개념
- CountDownLatch는 초기 카운트를 가지고 생성됨.
- 스레드들이 작업을 마친 후 countDown()을 호출해서 카운트를 감소시킴.
- 다른 스레드는 await()을 호출해 카운트가 0이 될 때까지 기다림.
- 한 번 카운트가 0이 되면, 다시 초기화할 수 없음.
✅ 주요 메서드
| countDown() | 카운트를 1 감소시킴 |
| await() | 카운트가 0이 될 때까지 현재 스레드를 대기시킴 |
✅ 사용 예제
import java.util.concurrent.CountDownLatch;
public class CountdownExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3); // 카운트 3 설정
for (int i = 0; i < 3; i++) {
int workerId = i;
new Thread(() -> {
System.out.println("Worker " + workerId + " is working...");
try {
Thread.sleep((long) (Math.random() * 2000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Worker " + workerId + " finished.");
latch.countDown(); // 카운트 감소
}).start();
}
System.out.println("Main thread waiting for workers...");
latch.await(); // 모든 워커가 끝날 때까지 대기
System.out.println("All workers finished. Main thread proceeds.");
}
}
✅ 활용 사례
- 여러 스레드가 병렬로 작업하고, 메인 스레드가 결과를 기다릴 때
- 테스트 환경에서 비동기 작업이 모두 끝난 후 검증할 때
- 서비스 초기화 과정에서 모든 의존 모듈이 준비될 때까지 대기할 때
CountDownLatch와 CyclicBarrier나 Semaphore의 차이점
🔁 CountDownLatch vs CyclicBarrier vs Semaphore
| 기능/구조 | CountDownLatch | CyclicBarrier | Semaphore |
| 기본 목적 | 하나 이상의 스레드가 작업이 완료되길 기다림 | 지정된 수의 스레드가 모두 도달할 때까지 대기 | 허용된 수만큼의 스레드가 리소스에 접근하도록 제한 |
| 카운트 재사용 가능 여부 | ❌ 재사용 불가 (일회성) | ✅ 재사용 가능 (자동 reset) | ✅ 사용자가 release()로 조절 가능 |
| 동작 방식 | 한 스레드가 await() → 다른 스레드들이 countDown() | 여러 스레드가 await() → 지정된 수만큼 도달해야 모두 진행 | 여러 스레드가 acquire() → 리소스 점유 후 release() |
| 주 용도 | 작업 완료 기다리기 (예: 비동기 작업 완료 후 처리) | 모든 스레드가 동시에 시작하거나 동기화 필요할 때 | 리소스 접근 제한 (예: DB 커넥션, 네트워크 소켓 등) |
| 예시 상황 | 메인 스레드가 백그라운드 작업들 기다릴 때 | 경기 시작 전 선수들 모두 준비됐는지 확인 | 동시에 3개만 연결 가능한 API 제한 등 |
✅ 예시
CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
Thread1: doWork(); latch.countDown();
Thread2: doWork(); latch.countDown();
Thread3: doWork(); latch.countDown();
MainThread: latch.await(); // 3명 다 끝날 때까지 기다림
CyclicBarrier
CyclicBarrier barrier = new CyclicBarrier(3);
Thread1: barrier.await(); // 모두 도달할 때까지 대기
Thread2: barrier.await();
Thread3: barrier.await(); // → 여기서 3명 동시에 진행됨 (재사용 가능)
Semaphore
Semaphore sem = new Semaphore(2); // 최대 2개 동시 접근
Thread1: sem.acquire(); // 진입
Thread2: sem.acquire(); // 진입
Thread3: sem.acquire(); // 대기 (다른 2개가 release() 해야 진입 가능)
✨ 요약하면...
- ✅ CountDownLatch: 비동기 완료 기다릴 때
- ✅ CyclicBarrier: 모두 동시에 출발할 때
- ✅ Semaphore: 리소스 접근 수 제한할 때
'JAVA' 카테고리의 다른 글
| Effective Java 클래스와 멤버의 접근 권한을 최소화하라 (1) | 2023.05.18 |
|---|---|
| Effective Java finalizer와 cleaner 사용을 피하라 (0) | 2023.04.20 |
| Effective Java 불필요한 객체 생성을 피하라 (1) | 2023.04.17 |
| Effective Java 의존 객체 주입 (0) | 2023.04.13 |
| Effective Java 싱글턴 part2. (feat. 메서드 참조, 함수형 인터페이스, 직렬화) (1) | 2023.04.11 |