При написании собственного компилятора для языка, подобного Java, у меня возникли проблемы с компиляцией synchronized blocks
. Мне пришла в голову следующая идея упростить их до try-finally
блоков:
synchonized (obj) {
statements...
}
Можно заменить на
Object _lock = obj
_monitorEnter(lock)
try {
statements...
}
finally {
_monitorExit(lock)
}
Где _monitorEnter
и _monitorExit
представляют инструкции MONITORENTER
и MONITOREXIT
.
Я прав с этим предположением о том, как компилируется synchronized
, или я что-то упускаю?
ИЗМЕНИТЬ
Моя реализация ранее имела специальную обработку операторов return
и throw
внутри тела. По сути, он будет вручную загружать все lock
переменных и MONITOREXIT
их перед каждой *RETURN
или THROW
инструкцией. Это обрабатывается блоком finally
или мне все еще нужны эти проверки?
java.util.concurrent.locks.Lock
а>. - person Boris the Spider   schedule 23.01.2016synchronized
наtry … finally
ничего не упрощает, так как тогда вы все равно должны реализоватьtry … finally
, не так ли? Так что вам все равно придется позаботиться о любом оператореreturn
самостоятельно. - person Holger   schedule 25.01.2016synchronized
иfinally
, не имеют эквивалента на уровне байт-кода, но обходной путь одинаков. Как правило, при разработке компилятора для JVM настоятельно рекомендуется знать всю Глава «Компиляция для виртуальной машины Java» (если не вся спецификация JVM)… - person Holger   schedule 25.01.2016