Language/Java / / 2023. 8. 1. 14:25

[Java] CountDownLatch

반응형

CountDownLatch는 어떤 쓰레드가 다른 쓰레드에서 작업이 완료될 때 까지 기다릴 수 있도록 해주는 클래스입니다.

 

예를 들어, 우리는 5개의 요청이 모두 끝날때 까지 기다려야 하므로, CountDownLatch를 사용할 것이다. 

 

Main thread에서 5개의 쓰레드를 생성하여 어떤 작업을 병렬로 처리되도록 할 수 있습니다. 이 때 Main thread는 다른 쓰레드가 종료되는 것을 기다리지 않고 다음 코드(statements)를 수행합니다. 여기서 CountDownLatch를 사용하면 다음 코드(statements)를 실행하지 않고 기다리도록 만들 수 있습니다.

 

CountDownLatch 사용 방법

CountDownLatch는 다음과 같이 생성할 수 있습니다. 인자로 Latch의 숫자를 전달합니다.

CountDownLatch countDownLatch = new CountDownLatch(5);

 

다음과 같이 countDown()을 호출하면 Latch의 숫자가 1개씩 감소합니다.

countDownLatch.countDown();

 

await()은 Latch의 숫자가 0이 될 때까지 기다리는 코드입니다.

countDownLatch.await();

다른 쓰레드에서 countDown()을 5번 호출하게 된다면 Latch는 0이 되며, await()은 더 이상 기다리지 않고 다음 코드를 실행하게 됩니다.

 

예제 코드

@Test
public void 동시에_100개의_요청() throws InterruptedException {
    int threadCount = 100;
    ExecutorService executorService = Executors.newFixedThreadPool(32); //비동기로 실행해야하는 것을 단순하게 사용할 수 있게 하는 API
    CountDownLatch latch = new CountDownLatch(threadCount);

    for (int i = 0; i < threadCount; i++) {
        executorService.submit(() -> {
            try {
                stockService.decrease(1L, 1L);
            } finally {
                latch.countDown();
            }
        });
    }
    latch.await();

    Stock stock = stockRepository.findById(1L).orElseThrow();
    assertEquals(0, stock.getQuantity());
}
반응형

'Language > Java' 카테고리의 다른 글

[Java] 동시성 이슈 해결하기  (0) 2023.08.01
[Java] Executors / ExecutorService 사용법  (0) 2023.08.01
Enum(EnumMap, EnumSet)  (0) 2023.07.06
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유