2015-02-11 53 views
1

如果我在Java中使用ReentrantLock ...當一個線程擁有對象的鎖定並且它試圖獲取另一個對象的另一個鎖定時,它會釋放第一個還是仍然存在拿住?Java中的嵌套監視器

+0

是什麼讓你覺得它應該隱式釋放另一個呢? – 2015-02-11 17:22:13

+0

我既不......也不關閉。 OP有問這個問題的原因.. – 2015-02-11 17:28:34

+0

謝謝你的答案 – 2015-02-11 17:42:07

回答

2

獲取新鎖不會釋放之前持有的任何鎖。你必須明確地發佈它們,通常在finally區塊內。

但總是要小心同時獲取多個鎖。總是檢查你是否造成死鎖。

2

獲取鎖定不會導致線程釋放其已獲取的任何其他鎖定。 The API documentation for the Lock interface指出,Lock的實現可以保存多個鎖,並使用一種技術(手工鎖定),除非線程一次可以保存多個鎖(添加了重點),否則將無法工作(重點添加):

儘管同步方法和語句 的作用域機制使得使用監視器鎖編程變得更容易,並且有助於避免涉及鎖的許多常見編程錯誤,但有時您需要以更靈活的方式使用鎖來處理鎖​​。例如, 用於遍歷併發訪問的數據結構的一些算法 需要使用「交換」或「鏈鎖定」:您獲取節點A的鎖,然後節點B,然後釋放A並獲取C,然後 發佈B並獲取D等。 接口的實現允許通過允許在不同示波器中獲取和發佈鎖並允許以任何順序獲取和釋放多個鎖來使用這種技術。

由於ReentrantLock實現Lock,所以應該適用。