Lock과 Condition을 이용한 동기화 synchronized를 사용하면 자동으로 lock이 잠기고 풀리는 편리함이 있지만 때로는 같은 메서드 내에서만 lock을 걸수 있다는 제약이 불편하기도 하다. 그럴땐 lock클래스를 사용한다. ReentrantLock 특정 조건에서 lock을 풀고 나중에 다시 lock을 얻고 임계영역으로 들어와서 이후의 작업을 수행할 수 있다. 배타적인 lock으로, 무조건 lock이 있어야만 임계영역의 코드를 수행할 수 있다. 매개변수에 true를 주면 lock이 풀렸을때 가장 오래 기다린 쓰레드가 lock을 획득할 수 있게 처리한다. (그러나 이렇게 처리하려면 어떤 쓰레드가 가장 오래 기다렸는지 확인해야 되기때문에 성능이 떨어진다) ReentrantReadWriteLoc..