synchronized로 지정된 임계영역은 한 스레드가 이 영역에 접근하여 사용할때 lock이 걸림으로써 다른 스레드가 접근할 수 없게 됩니다. 이후 해당 스레드가 이 임계영역의 코드를 다 실행 후 벗어나게되면 unlock 상태가 되어 그때서야 대기하고 있던 다른 스레드가 이 임계영역에 접근하여 다시 lock을 걸고 사용할 수 있게 됩니다. 

lock은 해당 객체당 하나씩 존재하며, synchronized로 설정된 임계영역은 lock 권한을 얻은 하나의 객체만이 독점적으로 사용하게됩니다.


synchronized는 객체가 가진 모니터 락을 이용해 동시성을 보장합니다.

스레드가 synchronized 영역에 진입하려면 먼저 해당 객체의 락을 획득해야 합니다. 하나의 스레드가 락을 가지고 있는 동안에는 다른 스레드가 동일한 락을 사용하는 synchronized 영역에 진입할 수 없기 때문에, 공유 데이터에 대한 작업이 동시에 실행되는 것을 막을 수 있습니다. 작업이 정상적으로 끝나거나 예외가 발생하면 락은 자동으로 해제됩니다.

또한 락을 해제하기 전의 작업은 이후 같은 락을 획득한 스레드에서 확인할 수 있도록 happens-before 관계가 형성되므로, 변경된 값의 가시성도 보장합니다.

인스턴스 synchronized 메서드는 해당 인스턴스인 this를, static synchronized 메서드는 Class 객체를 락으로 사용합니다. 따라서 여러 스레드가 서로 다른 락을 사용한다면 동시성이 보장되지 않으며, 반드시 같은 락을 기준으로 동기화해야 합니다.