Yeji's Tech Notes
article thumbnail
반응형

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

 

반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!