CountDownLatch의 정의
하나 이상의 스레드가 다른 스레드에서 수행 중인 작업이 완룓될 때까지 대기할 수 있는 동기화 보조 기능이라고 생각하시면 됩니다.
CountDownLatch는 다양한 용도로 사용할 수 있습니다.
CountDownLatch는 1개의 카운트로 초기화된 CountDownLatch는 on/off Latch 또는 게이트 역할을 해줍니다. 호출되는 모든 스레드는 countDown()을 호출하는 스레드에 의해 열릴 때까지 게이트에서 대기합니다. N으로 초기화 된 CountDownLatch는 N개의 스레드가 일부 작업을 완료하거나 일부 작업이 N번 완료될 때까지 스레드 하나를 대기시키는 데 사용할 수 있습니다.
CountDownLatch의 유용한 속성은 countDown을 호출하는 스레드가 진행하기 전에 카운트가 0에 도달할 때까지 기다릴 필요가 없으며 모든 스레드가 통과할 수 있을 때까지 모드 스레드가 대기 시간을 지나서 진행되는 것을 막습니다.
CountDownLatch의 작동원리
CountDownLatch는 다음과 같이 생성할 수 있습니다. 인자로 대기 숫자를 전달합니다.
CountDownLatch countDownLatch = new CountDownLatch(5);
countDown() 메소드를 호출하면 숫자가 한개씩 감소합니다.
countDownLatch.countDown();
await() 숫자가 0이 될 때까지 기다리는 코드입니다.
countDownLatch.await();
다른 쓰레드에서 countDown()을 5번 호출하게 된다면 숫자는 0이 되며, await()는 더이상 기다리지 않고 다음 코드를 실행하게 됩니다.
CountDownLatch 테스트 해보기
예제
스레드 작업 완료 후 다음 코드가 동작하는지 테스트하기
public class CountDownLatchTest {
@Test
@DisplayName("countDownLatch 테스트")
void test_case_1() throws Exception {
// given
CountDownLatch countDownLatch = new CountDownLatch(100);
ExecutorService executor = Executors.newFixedThreadPool(5);
// when
System.out.println("start CountDown");
for (int i = 1; i <= 100; i++) {
final int index = i;
executor.execute(() -> {
System.out.println(index);
countDownLatch.countDown();
});
}
countDownLatch.await();
// then
System.out.println("success CountDown");
}
}
결과
start CountDown
1
2
5
...
100
44
29
73
59
success CountDown
반복문이 정상적으로 동작하면서 후에 success CountDown이 print 되는 것을 확인할 수 있었습니다.
참고
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html
CountDownLatch (Java Platform SE 8 )
A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. A CountDownLatch is initialized with a given count. The await methods block until the current count reaches zero due to invo
docs.oracle.com
'Spring' 카테고리의 다른 글
쿠폰 발급 서비스 동시성 처리하기 2 - (2/3) (feat. Database Lock) (1) | 2024.01.30 |
---|---|
쿠폰 발급 서비스 동시성 처리하기 1 - (1/3) (feat. synchronized) (0) | 2024.01.15 |
[Test] 의미있는 단위 테스트 Naming Convention 작성하기 (0) | 2023.06.21 |
Spring에서 지연로딩 데이터 갖고오기 (0) | 2023.06.02 |
Nexus3를 이용한 Spring 라이브러리 배포 및 사용하기 (0) | 2023.05.23 |