반응형
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 |