PHpullh
학습 라이브러리/Java/CountDownLatch와 CyclicBarrier

JAVA · 비동기/동시성

CountDownLatch와 CyclicBarrier

스레드 동기화 도구인 CountDownLatchCyclicBarrier를 비교합니다.

비동기/동시성고급CountDownLatchCyclicBarrier동기화배리어

핵심 설명

스레드 동기화 도구인 CountDownLatchCyclicBarrier를 비교합니다.

Java code

import java.util.concurrent.*;

public class SyncTools {
    public static void main(String[] args) throws Exception {
        // CountDownLatch — 일회용, N개 이벤트 대기
        int workerCount = 3;
        CountDownLatch latch = new CountDownLatch(workerCount);

        for (int i = 0; i < workerCount; i++) {
            final int id = i;
            new Thread(() -> {
                System.out.println("Worker " + id + " 완료");
                latch.countDown(); // 카운트 감소
            }).start();
        }
        latch.await(); // 0이 될 때까지 대기
        System.out.println("모든 Worker 완료!");

        // CyclicBarrier — 재사용 가능, 모두 도달 시 진행
        int parties = 3;
        CyclicBarrier barrier = new CyclicBarrier(parties,
            () -> System.out.println("== 모두 도착! 다음 단계 =="));

        for (int i = 0; i < parties; i++) {
            final int id = i;
            new Thread(() -> {
                try {
                    System.out.println("Runner " + id + " 1단계");
                    barrier.await(); // 모두 대기
                    System.out.println("Runner " + id + " 2단계");
                    barrier.await(); // 재사용!
                } catch (Exception e) { e.printStackTrace(); }
            }).start();
        }

        Thread.sleep(1000); // 결과 출력 대기
    }
}

학습 팁

CountDownLatch는 일회용(카운트 리셋 불가), CyclicBarrier는 재사용 가능합니다. 단계별 병렬 처리에는 Barrier가 적합합니다.

주의할 점

CyclicBarrier에서 한 스레드가 예외로 중단되면 다른 스레드도 BrokenBarrierException을 받습니다. 예외 처리를 반드시 하세요.

자주 묻는 질문

CountDownLatch와 CyclicBarrier란 무엇인가요?

스레드 동기화 도구인 CountDownLatch 와 CyclicBarrier 를 비교합니다.

CountDownLatch와 CyclicBarrier 학습 시 주의할 점은 무엇인가요?

CyclicBarrier 에서 한 스레드가 예외로 중단되면 다른 스레드도 BrokenBarrierException 을 받습니다. 예외 처리를 반드시 하세요.

Continue Learning

Java 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.