[Java] CyclicBarrier
CyclicBarrier, java.util.concurrent.CyclicBarrier, 사이클 배리어, 재사용 배리어
정의
java.util.concurrent.CyclicBarrier 는 N 개의 스레드가 모두 도착할 때까지 서로 기다리는 synchronizer. 모두 도착하면 동시에 출발, 다시 사용 가능 (cyclic).
시각화
핵심 메서드
CyclicBarrier barrier = new CyclicBarrier(N);
CyclicBarrier withAction = new CyclicBarrier(N, () -> {
// 모두 도착 시 한 번 실행되는 action
System.out.println("all arrived");
});
barrier.await(); // 도착, 다른 스레드도 도착할 때까지 block
barrier.await(timeout, unit);
barrier.getNumberWaiting(); // 현재 대기 중인 스레드 수
barrier.reset(); // 모든 대기자 깨우고 BrokenBarrierException 던짐
가장 흔한 패턴, 단계별 동시 실행
CyclicBarrier barrier = new CyclicBarrier(4);
for (int i = 0; i < 4; i++) {
new Thread(() -> {
for (int phase = 0; phase < 3; phase++) {
doPhaseWork(phase);
barrier.await(); // 다른 3 스레드 도착 대기
// 모두 같은 phase 완료 후 다음 phase 진입
}
}).start();
}
병렬 계산의 각 phase 가 모두 끝나야 다음 phase 시작 가능한 경우 (예: 시뮬레이션 stepping).
BrokenBarrierException
한 스레드가 await 도중 인터럽트되거나 timeout 되거나 reset() 호출되면 다른 모든 대기자가 BrokenBarrierException 으로 깨어남. 한 명이 broken 이면 모두 broken.
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
// 처리
}
CountDownLatch vs CyclicBarrier vs Phaser
| 항목 | CountDownLatch | CyclicBarrier | Phaser |
|---|---|---|---|
| 재사용 | ✗ | ✓ | ✓ |
| 대칭 | 비대칭 (N → 0) | 대칭 (N 만남) | 대칭 + 동적 |
| 참여자 수 | 고정 | 고정 | 동적 (register/deregister) |
| 콜백 | ✗ | barrier action | onAdvance hook |
| 도입 | JDK 1.5 | JDK 1.5 | JDK 1.7 |
CyclicBarrier 는 N 이 고정이지만 반복, Phaser 는 N 이 매 phase 마다 바뀔 수 있다.
참고
이 글의 용어 (4개)
- [Java] CountDownLatchjava
- 정의 는 한 스레드 또는 여러 스레드가 다른 스레드들의 작업 완료를 기다리는 일회용 synchronizer. 으로 초기화하고, 각 worker 가 작업 후 호출. waiter 는…
- [Java] Phaserjava
- 정의 는 의 확장. 참여자 수가 동적으로 변할 수 있는 단계별 동기화. JDK 1.7 도입. 시각화 핵심 메서드 동적 참여 예 worker 가 도중에 추가/종료될 수 있는 경우 …
- [Java] Semaphorejava
- 정의 는 N 개의 permit (허가) 을 발급/회수 하는 synchronizer. permit 이 있으면 진행, 없으면 또는 즉시 실패. 자원 풀, rate limiting, …
- Blocking (블로킹)concurrency
- 정의 Blocking 은 호출이 결과가 준비될 때까지 호출 스레드를 멈춰두는 실행 방식. 멈춰 있는 동안 그 스레드는 다른 일을 할 수 없다. OS 가 스레드를 sleep 상태로…
💬 댓글