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

[Java] CyclicBarrier

· 수정 · 📖 약 1분 · 234자/단어 #java #concurrent #synchronizer #barrier
CyclicBarrier, java.util.concurrent.CyclicBarrier, 사이클 배리어, 재사용 배리어

정의

java.util.concurrent.CyclicBarrierN 개의 스레드가 모두 도착할 때까지 서로 기다리는 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

항목CountDownLatchCyclicBarrierPhaser
재사용
대칭비대칭 (N → 0)대칭 (N 만남)대칭 + 동적
참여자 수고정고정동적 (register/deregister)
콜백barrier actiononAdvance hook
도입JDK 1.5JDK 1.5JDK 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 상태로…

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

💬 댓글

사이트 검색 / 명령어

검색

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