Взгляните на документацию оракула страница , чтобы ясно понять концепции.
Синхронизация строится вокруг внутренней сущности, известной как внутренняя блокировка или блокировка монитора.(Спецификация API часто ссылается на эту сущность просто как на «монитор».) Внутренние блокировки играют роль в обоих аспектах синхронизации: обеспечение исключительного доступа к состоянию объекта и установление отношений «до и после», которые важны для видимости.
Каждый объект имеет встроенную блокировку, связанную с ним.По соглашению, поток, которому требуется исключительный и согласованный доступ к полям объекта, должен получить внутреннюю блокировку объекта перед тем, как получить к ним доступ, а затем снять внутреннюю блокировку, когда с ними покончено.
Говорят, что поток владеетвнутренняя блокировка между моментом, когда он получил блокировку и снял блокировку.Пока потоку принадлежит внутренняя блокировка, никакой другой поток не может получить такую же блокировку.Другой поток заблокируется, когда попытается захватить замок.
Javaword article by Bill Venners
однозначно объясняет, что на самом деле происходит под капотами.
Twoкоды операций monitorenter
и monitorexit
используются для блоков синхронизации
Когда Java virtual machine
встречается с monitorenter
, он получает блокировку для объекта, на который ссылается objectref в стеке.Если поток уже владеет блокировкой для этого объекта, счетчик увеличивается.
Каждый раз, когда для потока объекта выполняется monitorexit
, счет уменьшается.Когда счетчик достигает нуля, монитор освобождается.
Как только монитор освобождается, один из ожидающих потоков получает монитор, и вышеуказанный процесс повторяется снова.
Посмотрите на связанные вопросы SE:
Что означает «синхронизированный»?
Как работает синхронизация в Java?