내부적으로 객체의 "monitor lock"을 사용하여 동기화를 보장함
Monitor는 특정 객체 또는 클래스에 대한 고유 락(lock)을 관리하는 역할을 함
java에서 모든 객체(Object)는 기본적으로 하나의 모니터 락을 가지고 있음
synchronized 가 사용되면, 스레드는 해당 객체의 모니터 락을 획득해야만 실행할 수 있음
즉 synchronized키워드를 사용하면 JVM은 monitor lock얻을 때까지 다른 스레드를 대기시키고, 락을 해제해야만 다음 스레드가 실행됨
ReentrantLock이 존재함
ReentrantLock은 synchronized 보다 정교한 락 제어가 가능함
락을 명시적으로 획득(lock) 하고 해체(unlock)해야 함
더 유연한 동기화가 가능함 (tryLock(), locklnterruptidly() 등을 지원함)
ReentrantLock이 더 유용한 경우
더 정교한 제어 가능
공정성 모드 설정 가능 (true로 설정 시 가장 오래 대기한 스레드가 먼저 실행)
동기화 블록을 여러 메소드에 걸쳐 적용 가능