Synchronized 메소드에 사용 하게 되면 해당 메소드가 끝날떄 까지 메소드의 락을 걸게 된다. 공유된 자원에 락을 거는 것이 아닌 메소드에 거는 것이다.
synchronized 블록에 경우 인자로 받은 객체의 락을 걸게되며, 블록이 끝날때 까지 락을 유지한다.
자바의 모든 객체는 락을 가지고 있다. 이러한 락은 고유 락 또는 모니터 락 이라고 부른다.
synchronized는 암시적 락(고유 락)이라 하며, 진입 순서를 a 메소드 획득 → b 메소드 획득 → b 메소드 해제 → a 메소드 해제 순으로만 할당 및 해제가 가능하며 이러한 것을 구조적인 락(structured lock)이라 한다.
만일 a 획득 → b 획득 → a 해제 → b 해제 순으로 락을 사용하고 싶으면 ReentantLock과 같은 명시적인 락을 사용해야 한다.
jdk 5 부터 추가된 클래스이다. 암시적인 락(synchronized)과 같은 동작을 하지만 명시적으로 쓰레드에 락을 걸수 있다.
ReentrantLoc에서는 wait, nofity, notifyAll 을 사용할 수 없다. 대체제로 await, signal, signalAll을 사용하면 된다.
위 3개의 메소드를 사용하기 위해선 java.util.concurrent.locks.Condition과 함께 사용해야 한다.
class Test {
private final ReentrantLock locker = new ReentrantLock();
private final Condition lockerCondition = locker.newCondition();
public void testMethod() {
//...
lockerCondition.await(); // wait
lockerCondition.signal(); // notify
lockerCondition.signalAll(); //notifyAll
}
}
기타 메소드