지난 글에서는 Semaphore(이하 세마포어)를 알아봤다. 이번에는 Thread의 동시 실행과 관련된 기능을 하지만 차이가 있어 헷갈리는 CountDownLatch(이하 래치)를 정리한다.
세마포어는 동시에 실행할 수 있는 스레드 수를 조절해서 고정된 리소스의 사용을 제한할 수 있었다.
이해하기 쉽게 예를 들자면, 어떤 공연의 좌석이 정해져 있는데 입구에서 관리자가 좌석 만큼의 인원만 수용하도록 체크하는 것과 같다.
그에 비해 래치는 경마장에서 출발 선상에 있는 말들이 모두 오기를 기다리는 것과 같다.
모든 말이 출발 준비를 마치고 출발선에 오면 경주가 시작되듯 그 시점까지 기다리게 한다.
래치를 생성할 때 수행할 스레드 수를 지정한다.
그리고 await 메서드를 실행하는데, 이 지점에서 모든 스레드가 준비되었는지 대기한다.
준비되었다는 신호는 countDown 메서드로 알려준다. countDown의 이름처럼 준비가 필요해서 기다려야 하는 스레드가 하나씩 줄어든다.
아래 코드도 세마포어 처럼 IBM 블로그에서 제공한 코드를 가져왔다.
코드를 살펴보면 특정 이름을 가진 말들을 준비한다.
그리고 레이스가 시작하면 임의의 레이스 거리가 만들어지며, 랜덤한 수행시간에 달린 랜덤한 거리를 레이스 거리에서 빼가면서 말들이 각자 다른 속도로 달려감을 표현했다.
래치는 마지막 결승점에 모든 말들이 도착할 때까지 대기하도록 await를 걸고, 각 말들이 레이스를 끝내면 countDown 메서드로 끝났음을 알렸다.
모든 말들의 레이스가 끝나면 래치로 인한 대기가 끝나게 되고 레이스 결과를 표시해 준다.
레이스를 예로 래치를 적용하니 이해하기가 쉬웠다.
병렬 프로그래밍을 하다가 모든 스레드를 동시에 수행시켜서 성능 테스트를 할 때가 있다. 이런 경우 래치를 사용하면 된다.
관련 문서
'Language > Java' 카테고리의 다른 글
AtomicIntegerFieldUpdater (0) | 2023.04.08 |
---|---|
[NIO] WatchService (0) | 2020.07.28 |
[multi thread] Semaphore (0) | 2020.06.02 |
[Java9] Collections, Streams (0) | 2020.03.13 |
Proxy를 통한 Restful API 호출 by Java (0) | 2019.12.09 |