內容:通過獲取鎖的順序來避免死鎖。例如:銀行賬戶轉賬問題,兩個使用者轉賬的話,如果採用一般的synchronized巢狀的話,容易造成死鎖,現在我們通過類似哲學家問題的解決方案一樣:先獲取同乙個鎖,才有資格獲取下乙個。而判斷是通過system.identityhashcode()來生成類的hashcode()的返回值作為唯一標識,相同的話,我們再加一把鎖。
class account
public void debit(int amount)
public void credit(int amount)
public int get()
}public class orderlock
}}
int fromhash = system.identityhashcode(fromacct);
int tohash = system.identityhashcode(toacct);
if (fromhash < tohash)
}} else if (fromhash > tohash)
}} else }}
} }class mythread implements runnable
@override
public void run() catch (insufficientresource***ception e)
} }
public static void main(string args)
}}
java 解決動態的鎖順序死鎖
我們可以制定鎖的順序,並在整個應用程式中,獲得鎖都必須始終遵守這個既定的順序。我們在制定物件順序的時候,可以使用system.identityhashcode這樣一種方式,它會返回object.hashcode所返回的值。在極少數的情況下,2個物件具有相同的雜湊碼,我們必須使用任意的中數來決定鎖的順...
Java死鎖及死鎖的避免
鎖是個非常有用的工具,運用場景非常多,因為它使用起來非常簡單,而且易於理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產生死鎖,就會造成系統功能不可用。1.系統資源不足 2.進行執行推進的順序不合適 3.資源分配不當 如果系統資源充足,程序的資源請求都能得到滿足,死鎖出現的可能性就很低,否...
以全域性的固定順序獲取多個鎖來避免死鎖
當兩個或多個執行緒互相等待時被阻塞,就會發生死鎖。例如,第乙個執行緒被第二個執行緒阻塞,它在等待第二個執行緒持有的乙個資源。而第二個執行緒在獲得第乙個執行緒持有的某個資源之前不會釋放這個資源。由於第乙個執行緒在獲得第二個執行緒持有的那個資源之前不會釋放它自己所持有的資源,而第二個執行緒在獲得第乙個執...