ReentrantLock 클래스, ReentrantLock 클래스 생성자, 동기화 메소드

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() 의해 작업을 취소할 있도록 코드를 작성할 있습니다.