본문으로 건너뛰기
김신건의 로그

[Java] Phaser

· 수정 · 📖 약 1분 · 169자/단어 #java #concurrent #synchronizer #barrier #dynamic
Phaser, java.util.concurrent.Phaser, 페이저, 동적 배리어

정의

java.util.concurrent.PhaserCyclicBarrier 의 확장. 참여자 수가 동적으로 변할 수 있는 단계별 동기화. 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 비교

기능CountDownLatchCyclicBarrierPhaser
재사용
참여자 동적 변경
한 명만 도착 (대기 안 함)✓ (arrive)
콜백barrier actiononAdvance
트리 구조 (계층)✓ (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 상태로…

이 개념을 다룬 위키 페이지 (2)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기