Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Java] Lock 걸기 좋아졌다 (java.util.concurrent.locks.Lock) Computer & Program

스레드간 동기화를 위해 lock object를 많이 이용한다.
여러 스레드 중 한 스레드에서만 접근해야 하는 곳에 synchronized 블럭과 wait(), notify(), notifyAll() 등을 이용해서 동시에 접근하지 못 하도록 한다. wait()나 notify(), notifyAll() 등을 호출해서 스레드를 멈출 때는 스레드의 monitor를 획득해야 한다. 실행시에 monitor가 없는 경우 IllegalMonitorStateException을 생성한다.

이번에도 스레드간 동기화를 위해 lock을 간단하게 거는 클래스를 만들려는데 lock을 푸는 메소드 이름을 unlock()으로 해야 할지 releaseLock()이나 release()로 해야 할지 고민에 빠졌다. 혹시 JDK에 이런 비슷한 Lock 클래스가 있다면 이 메소드 이름을 뭐로 했는지 참조하려고 API를 찾는데.. 어라?? 이런 클래스가 이미 존재하네?? -ㅅ-;;; 이름도 Lock이다. 내가 손수 안 만들고 이걸 써도 될 것 같다.

Lock 인터페이스의 사용은 synchronized를 이용한 동기화와 비슷하다. ReentrantLock 등과 같이 Lock을 구현한 클래스를 lock object에 synchronized를 이용해서 lock을 걸듯이 사용하면 된다.
Lock l = ...; // lock 객체를 생성한다.
// Lock l = new ReentrantLock();
// 이로케?? 간단하게 구현된 녀석을 써도 된다.
l.lock();
try
{
    lock을 걸고 작업해야 하는 부분
}
finally
{
    // 반드시 풀어주자.. 여기가 아니더라도 lock을 풀어야 하는 곳에서는 반드시..
    l.unlock();
}


lock()을 호출하면 해당 Lock 객체의 lock을 획득하려고 한다. 아직 아무도 lock을 획득하지 않았으면 Lock 객체의 lock을 획득하고 다음 코드를 수행한다. 하지만 같은 Lock 객체의 lock을 이미 다른 스레드가 획득한 상태이면, 그 스레드가 lock을 해제(unlock())할 때 까지 block되어 Lock을 대기한다. lock을 획득할 때 까지 다음 코드를 수행하지 않는다. Lock을 획득한 스레드가 lock을 해제하면 Lock을 대기하고 있는 스레드에 알려서 Lock을 넘겨주게 된다.

Lock을 해제(unlock())할 때 어떤 스레드에 lock을 넘겨줄지 우선순위를 설정해서 불공정하게 넘겨줄 수도 있다. 더 자세한 내용과 예제는 요기조기 검색을.. 사실.. 주말이라 졸려서 @ㅅ@


- 참고 : java.util.concurrent.locks.Lock 예제

덧글

댓글 입력 영역

Google AdSense (text/image)