(譯者注:這裡提到的鎖都是指的不可重入的鎖實作,并不是java類庫中的lock與readwritelock類)
如果某個線程調用了outer(),outer()中的inner()調用是沒問題的,因為兩個方法都是在同一個管程對象(即this)上同步的。如果一
個線程持有某個管程對象上的鎖,那麼它就有權通路所有在該管程對象上同步的塊。這就叫可重入。若線程已經持有鎖,那麼它就可以重複通路所有使用該鎖的代碼
塊。
下面這個鎖的實作是不可重入的:
如果一個線程在兩次調用lock()間沒有調用unlock()方法,那麼第二次調用lock()就會被阻塞,這就出現了重入鎖死。
避免重入鎖死有兩個選擇:
編寫代碼時避免再次擷取已經持有的鎖
使用可重入鎖
至于哪個選擇最适合你的項目,得視具體情況而定。可重入鎖通常沒有不可重入鎖那麼好的表現,而且實作起來複雜,但這些情況在你的項目中也許算不上什麼問題。無論你的項目用鎖來實作友善還是不用鎖友善,可重入特性都需要根據具體問題具體分析。