[Java] Phaser
Phaser, java.util.concurrent.Phaser, 페이저, 동적 배리어
정의
java.util.concurrent.Phaser 는 CyclicBarrier 의 확장. 참여자 수가 동적으로 변할 수 있는 단계별 동기화. JDK 1.7 도입.
시각화
핵심 메서드
Phaser phaser = new Phaser(N);
phaser.arriveAndAwaitAdvance(); // 도착 + 다른 참여자 대기
phaser.arrive(); // 도착만 (대기 안 함)
phaser.awaitAdvance(phase); // 특정 phase 까지 대기
phaser.register(); // 참여자 추가
phaser.arriveAndDeregister(); // 도착 + 자신 제거
phaser.getPhase(); // 현재 phase 번호
phaser.getRegisteredParties();
동적 참여 예
Phaser phaser = new Phaser(1); // 시작 시 main 만 등록
for (int i = 0; i < workers; i++) {
phaser.register(); // worker 추가
new Thread(() -> {
while (running) {
doPhaseWork();
phaser.arriveAndAwaitAdvance(); // 다른 worker 대기
}
phaser.arriveAndDeregister(); // 종료 시 deregister
}).start();
}
phaser.arriveAndDeregister(); // main 도 제거
worker 가 도중에 추가/종료될 수 있는 경우 CyclicBarrier 로는 표현 어렵다.
onAdvance 콜백
Phaser phaser = new Phaser() {
@Override
protected boolean onAdvance(int phase, int registered) {
System.out.println("phase " + phase + " done");
return phase >= 10 || registered == 0; // true 면 종료
}
};
각 phase 가 끝날 때 호출. true 반환하면 phaser 종료.
CountDownLatch / CyclicBarrier / Phaser 비교
| 기능 | CountDownLatch | CyclicBarrier | Phaser |
|---|---|---|---|
| 재사용 | ✗ | ✓ | ✓ |
| 참여자 동적 변경 | ✗ | ✗ | ✓ |
| 한 명만 도착 (대기 안 함) | ✗ | ✗ | ✓ (arrive) |
| 콜백 | ✗ | barrier action | onAdvance |
| 트리 구조 (계층) | ✗ | ✗ | ✓ (parent phaser) |
가장 유연하지만 그만큼 복잡. 단순 N → 0 은 CountDownLatch, 고정 N 반복은 CyclicBarrier 가 더 간단.
참고
이 글의 용어 (4개)
- [Java] CountDownLatchjava
- 정의 는 한 스레드 또는 여러 스레드가 다른 스레드들의 작업 완료를 기다리는 일회용 synchronizer. 으로 초기화하고, 각 worker 가 작업 후 호출. waiter 는…
- [Java] CyclicBarrierjava
- 정의 는 N 개의 스레드가 모두 도착할 때까지 서로 기다리는 synchronizer. 모두 도착하면 동시에 출발, 다시 사용 가능 (cyclic). 시각화 핵심 메서드 가장 흔한…
- [Java] Semaphorejava
- 정의 는 N 개의 permit (허가) 을 발급/회수 하는 synchronizer. permit 이 있으면 진행, 없으면 또는 즉시 실패. 자원 풀, rate limiting, …
- Blocking (블로킹)concurrency
- 정의 Blocking 은 호출이 결과가 준비될 때까지 호출 스레드를 멈춰두는 실행 방식. 멈춰 있는 동안 그 스레드는 다른 일을 할 수 없다. OS 가 스레드를 sleep 상태로…
💬 댓글