Java多線程運行環境中,在哪些情況下會使對象鎖釋放?
答:由於等待一個鎖的線程只有在獲得這把鎖之后,才能恢復運行,所以讓持有鎖的線程在不再需要鎖的時候及時釋放鎖是很重要的。在以下情況下,持有鎖的線程會釋放鎖:
(1)執行完同步代碼塊,就會釋放鎖。(synchronized)
(2)在執行同步代碼塊的過程中,遇到異常而導致線程終止,鎖也會被釋放。(exception)
(3)在執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放鎖,進
入對象的等待池。(wait)
除了以上情況以外,只要持有鎖的線程還沒有執行完同步代碼塊,就不會釋放鎖。
在下面情況下,線程是不會釋放鎖的:
(1)執行同步代碼塊的過程中,執行了Thread.sleep()方法,當前線程放棄CPU,開始睡眠,進入堵塞狀態,在睡眠中不會釋放鎖。
(2)在執行同步代碼塊的過程中,執行了Thread.yield()方法,當前線程放棄CPU,回到就緒狀態,但不會釋放鎖。