이전에 java.util.concurrent에 포함된 유용한 동기화 클래스들을 정리한 적이 있다.
해당 글은 다음 링크에서 확인할 수 있다.
동기화 클래스들이 더 있는데 이번 글에서는 Semaphore(이하 세마포어)에 대해서 정리한다.
세마포어는 특정 자원이나 특정 연산을 동시에 사용하거나 호출할 수 있는 스레드의 수를 제한하고자 할 때 사용한다.
자원 풀이나 컬렉션의 크기에 제한을 두고자 할 때 유용하다.
세마포어는 생성자에 퍼밋의 숫자를 받아서 해당 수 만큼 동시 사용을 허용한다.
permit을 사전에서 찾아보면 다음과 같은데 특정 수 만큼 허가증을 발급한다고 이해하자.
[불][가]〔…의〕 인가(서), 허가(증), 면허(장) (※특히 여행·노동·수출 등 기한이 있는 것을 말함), 감찰〔for …〕
acquire() 메서드를 호출하면 최대 퍼밋이 될 때까지 등록을 허가하며, release() 메서드는 한 퍼밋을 해제한다.
아래 코드를 살펴보자. 코드는 IBM 블로그에 있는 코드에서 가져왔다.
코드를 보면 10개의 스레드를 생성하는데 세마포어는 3개의 퍼밋만 허용했다.
각 스레드는 임의의 수행시간(최대 15초)이 걸리기 때문에 종료 시점이 다르다.
코드를 실행해 보면 수행시간이 짧은 스레드가 작업을 마치고 release() 메서드를 호출하면 대기하던 다른 스레드가 실행된다.
의도했던 대로 여러 작업을 고정된 리소스에서 처리하고자 할 때 유용하다.
참고 문서
'Language > Java' 카테고리의 다른 글
[NIO] WatchService (0) | 2020.07.28 |
---|---|
[multi thread] CountDownLatch (0) | 2020.06.04 |
[Java9] Collections, Streams (0) | 2020.03.13 |
Proxy를 통한 Restful API 호출 by Java (0) | 2019.12.09 |
[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류 (0) | 2019.07.11 |