java题库4
?1.
??由于等待一個鎖定線程只有在獲得這把鎖之后,才能恢復運行,所以讓持有鎖的線程在不需要鎖的時候及時釋放鎖是很重要的。在以下情況下,持有鎖的線程會釋放鎖:
? ? 1. 執行完同步代碼塊。? ? 2. 在執行同步代碼塊的過程中,遇到異常而導致線程終止。
? ? 3. 在執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放鎖,進行對象的等待池。
? ? 除了以上情況外,只要持有鎖的此案吃還沒有執行完同步代碼塊,就不會釋放鎖。因此在以下情況下,線程不會釋放鎖:
? ? 1. 在執行同步代碼塊的過程中,執行了Thread.sleep()方法,當前線程放棄CPU,開始睡眠,在睡眠中不會釋放鎖。
? ? 2. 在執行同步代碼塊的過程中,執行了Thread.yield()方法,當前線程放棄CPU,但不會釋放鎖。
? ? 3. 在執行同步代碼塊的過程中,其他線程執行了當前對象的suspend()方法,當前線程被暫停,但不會釋放鎖。但Thread類的suspend()方法已經被廢棄。
? ? 避免死鎖的一個通用的經驗法則是:當幾個線程都要訪問共享資源A、B和C時,保證使每個線程都按照同樣的順序去訪問他們,比如都先訪問A,再訪問B和C。
總結