Synchronized의 LOCK과 LOCK의 범위


Synchronized 메소드에 사용 하게 되면 해당 메소드가 끝날떄 까지 메소드의 락을 걸게 된다. 공유된 자원에 락을 거는 것이 아닌 메소드에 거는 것이다.

synchronized 블록에 경우 인자로 받은 객체의 락을 걸게되며, 블록이 끝날때 까지 락을 유지한다.

Synchoronized, ReentrantLock


자바의 모든 객체는 락을 가지고 있다. 이러한 락은 고유 락 또는 모니터 락 이라고 부른다.

구조적인 락(structured lock)

synchronized는 암시적 락(고유 락)이라 하며, 진입 순서를 a 메소드 획득 → b 메소드 획득 → b 메소드 해제 → a 메소드 해제 순으로만 할당 및 해제가 가능하며 이러한 것을 구조적인 락(structured lock)이라 한다.

만일 a 획득 → b 획득 → a 해제 → b 해제 순으로 락을 사용하고 싶으면 ReentantLock과 같은 명시적인 락을 사용해야 한다.

ReentrantLcok

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
	}
}

기타 메소드