編寫一個類似Java的語言編譯器,我在編譯synchronized blocks
時遇到問題。我想出了以下的想法給他們簡化爲try-finally
塊:可以將一個同步塊簡化爲字節碼級上的Try-Finally塊嗎?
synchonized (obj) {
statements...
}
可與
Object _lock = obj
_monitorEnter(lock)
try {
statements...
}
finally {
_monitorExit(lock)
}
凡_monitorEnter
和_monitorExit
更換代表MONITORENTER
和MONITOREXIT
說明。
我是否正確編譯了這個假設,還是我錯過了一些東西?
編輯
我以前執行過一些特殊的處理在體內return
和throw
語句。基本上,它會在每個*RETURN
或THROW
指令之前手動加載所有lock
變量和MONITOREXIT
。這是由finally
塊處理,還是我仍然需要這些檢查?
是的,這是正確的。實際上,這是['java.util.concurrent.locks.Lock']的_exact_語法(https://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html)。 –
我不確定我是否理解你的想法。如果你是實現編譯器的人,用'try ... finally'替換'synchronized'並不能簡化任何事情,因爲你仍然是必須實現'try ... finally'的人,那麼,不是嗎?所以你仍然需要關心你自己的任何'return'語句。 – Holger
@Holger當然可以,但我必須兩次實施同樣的事情,所以犯錯誤的方法有兩倍。目前,同步字節碼的生成只是try/finally語句的一個特例。 – Clashsoft