Почему байт-коды Java для вызова методов неявно захватывают и освобождают мониторы?

Я читал набор инструкций виртуальной машины Java и заметил, что при использовании инструкций для вызова методы (например, invokestatic, invokevirtual и т. д.), которые помечены как синхронизированные, эта конкретная инструкция байт-кода должна получить монитор на объекте-получателе. Точно так же, при возврате из метода, инструкция, которая оставляет метод, освобождает монитор, когда метод синхронизируется. Это кажется странным, при условии, что существуют явные байт-коды monitorenter и monitorexit для управления мониторами. Есть ли какая-то особая причина для JVM, которая разрабатывает эти инструкции таким образом, а не просто компилирует методы для включения инструкций monitorenter и monitorexit, где это необходимо?

15
задан GEOCHET 7 August 2015 в 14:40
поделиться