Как он попадает в рабочую очередь, когда ожидает блокировки объектов?
Если поток заблокирован из-за попытки войти в блок synchronized
, поток автоматически помечается как работоспособный, когда другой поток (удерживающий блокировку) снимает блокировку, выходя из блока synchronized
того же объекта .
Если текущий поток заблокирован из-за вызова someObject.wait()
, поток "освобождается", когда другой поток вызывает someObject.notify()
.
На уровне байт-кода это выглядит следующим образом:
[load some object, obj, onto the operand stack]
monitorenter // grab the lock
// do stuff
[load obj onto the operand stack again]
monitorexit // release the lock
Если кто-то уже удерживает блокировку obj
, поток будет зависать на monitorenter
, пока другой поток не вызовет monitorexit
.
Точные подробности реализации monitorenter
и monitorexit
не определяются JLS. То есть это зависит от JVM / OS.
Подробнее см. Наборы ожидания JLS и уведомления .