1. 程式人生 > >Java多執行緒與鎖模型-順序鎖與資源鎖

Java多執行緒與鎖模型-順序鎖與資源鎖

順序鎖:當應用程式使用2把以上的鎖時,就容易出現因為多執行緒獲取鎖的順序不同而死鎖的情形,包括交叉獲取應用程式範圍內的多把已知鎖、交叉獲取應用程式與第三方方法中的多把鎖而造成的順序死鎖。絕大多數死鎖都是因為CPU排程多執行緒時,在執行時序上是交叉進行的而造成亂序獲得多把鎖,從而形成死鎖,所以,解決順序鎖的辦法就是總是按照一定的順序來獲取鎖!

資源鎖:最典型的資源鎖是CPU時鐘,多執行緒的程式如果是計算密集型的,那麼只要獲得鎖的執行緒進行長時間的計算,就會導致其他執行緒一直處於等待,也就是執行緒飢餓,這種問題,除了增加計算資源,別無他法,屬於頂層結構限制。

活鎖:死鎖是執行緒因為長時間獲取不到鎖而進入僵死的狀態,而活鎖是因為多執行緒總是同時獲取幾把鎖中的一把,在一定時間內等不到其他鎖,就釋放了已經獲得的鎖,等待一段時間後,再次獲取鎖,再次等待一定時間無法獲得其他鎖,又釋放了已經獲得的鎖,周而復始,導致所有執行緒雖然沒有僵死,但都不能正常工作,最典型的例子是哲學家進餐問題,解決活鎖的方法是等待一個隨機的時間間隔後再次嘗試獲得鎖。