CODEDRAGON ㆍDevelopment/Java
ReentrantLock 클래스
· 가장 일반적인 lock입니다.
· 특정 조건일 때 lock을 풀고 나중에 다시 lock을 얻어 임계역역으로 들어와서 이후의 작업을 수행할 수 있기 때문에 앞에 reentrant(재진입할 수 있는)키워드가 붙었습니다.
· ReentrantLock은 배타적인 lock이라서 무조건 lock이 있어야만 임계영역의 코드를 수행할 수 있습니다. 지금까지 배운 lock의 방식과 일치합니다.
ReentrantLock 클래스 생성자
· 생성자의 매개변수(fair)를 true로 주면, lock이 풀렸을 때 가장 오래 기다린 쓰레드가 lock을 획득하도록 처리합니다. 즉, 공정(fair)상태.
· 공정하게 처리하려면 어떤 쓰레드가 가장 오래 기다렸는지 확인하는 과정이 추가적으로 필요하므로 성능은 떨어지게 됩니다. 대부분의 경우 공정하게 처리하지 않아도 문제가 되지 않으므로 공정함(fair)보다는 성능(performance)에 중점을 두어야 합니다.
ReentrantLock() ReentrantLock(boolean fair) |
동기화 메소드
자동적으로 lock의 잠금과 해제가 관리되는 synchronized블럭과 달리, ReentrantLock과 같은 lock클래스들은 메소드 호출을 통해 수동으로 lock을 잠그고 해제해야 합니다. 이 때 lock을 걸고 lock을 해제하는 것을 빠트리지 않아도록 주의해야 합니다.
메소드 |
설명 |
void lock() |
lock을 잠급니다. |
void unlock() |
lock을 해제합니다. |
boolean isLocked() |
lock이 잠겼는지 확인합니다. |
boolean tryLock() |
lock()와 달리 다른 쓰레드에 의해 lock이 걸려 있으면 lock을 얻기위해 기다리지 않습니다. |
boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException |
지정된 시간만큼만 기다립니다. lock을 얻으면 true를 반환하고 그렇지않으면 false를 반환합니다. |
void lock()
· lock()은 lock을 얻을 때까지 쓰레드를 블락(block)시키므로 쓰레드의 응답성이 나빠질 수 있습니다. 응답성이 중요한 경우, tryLock()메소드를 이용해서 지정된 시간동안 lock을 얻지못하면 다시 작업을 시도할 것인지 포기할 것인지를 사용자가 결정할 수 있게 하는 것이 좋습니다.
· tryLock()메소드는 InterruptedException예외를 발생 시킬 수 있는데 이때 지정된 시간동안 lock을 얻으려고 기다리는 중에 intterrupt()에 의해 작업을 취소할 수 있도록 코드를 작성할 수 있습니다.
'Development > Java' 카테고리의 다른 글
스레드 그룹 일괄 interrupt() (0) | 2018.12.11 |
---|---|
스레드 그룹 생성, 그룹에 새로운 스레드 추가하기 (0) | 2018.12.11 |
lock 인터페이스, lock 클래스 종류 (0) | 2018.12.10 |
스레드 그룹 정보 얻기 - getThreadGroup(), Thread.getAllStackTraces() (0) | 2018.12.10 |
동기화 방법-synchronized - 메서드의 동기화 방법(synchronized기반 동기화 메소드), 특정 블록의 동기화 방법(synchronized기반 동기화 블록) (0) | 2018.12.07 |