1. 程式人生 > >Java多執行緒釋放鎖

Java多執行緒釋放鎖

由於等待一個鎖定執行緒只有在獲得這把鎖之後,才能恢復執行,所以讓持有鎖的執行緒在不需要鎖的時候及時釋放鎖是很重要的。在以下情況下,持有鎖的執行緒會釋放鎖:

1. 執行完同步程式碼塊。

2. 在執行同步程式碼塊的過程中,遇到異常而導致執行緒終止。

3. 在執行同步程式碼塊的過程中,執行了鎖所屬物件的wait()方法,這個執行緒會釋放鎖,進行物件的等待池。

     除了以上情況外,只要持有鎖的此案吃還沒有執行完同步程式碼塊,就不會釋放鎖。因此在以下情況下,執行緒不會釋放鎖:

1.在執行同步程式碼塊的過程中,執行了Thread.sleep()方法,當前執行緒放棄CPU,開始睡眠,在睡眠中不會釋放鎖。

2. 在執行同步程式碼塊的過程中,執行了Thread.yield()方法,當前執行緒放棄CPU,但不會釋放鎖。

3.在執行同步程式碼塊的過程中,其他執行緒執行了當前物件的suspend()方法,當前執行緒被暫停,但不會釋放鎖。但Thread類的suspend()方法已經被廢棄。

     避免死鎖的一個通用的經驗法則是:當幾個執行緒都要訪問共享資源A、B和C時,保證使每個執行緒都按照同樣的順序去訪問他們,比如都先訪問A,再訪問B和C。

     java.lang.Object類中提供了兩個用於執行緒通訊的方法:wait()和notify()。需要注意到是,wait()方法必須放在一個迴圈中,因為在多執行緒環境中,共享物件的狀態隨時可能改變。當一個在物件等待池中的執行緒被喚醒後,並不一定立即恢復執行,等到這個執行緒獲得了鎖及CPU才能繼續執行,又可能此時物件的狀態已經發生了變化。