java中动态顺序死锁问题
生活随笔
收集整理的這篇文章主要介紹了
java中动态顺序死锁问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般來說,死鎖產生的原因是因為獲取鎖的順序不一致,所以如果有順序的將鎖寫入程序內。就可以解決死鎖,但是如果鎖是某個方法的入參,那么就會造成動態死鎖問題,比如說你設置了兩把鎖,分別為方法的兩個入參a,b,鎖的順序也在方法內實現了,先鎖a,再鎖b,此時有兩個線程A,B,A傳入a->x對象,b->y對象;B傳入a->y對象,b->x對象,線程A進入方法后鎖住了第一把鎖x對象準備獲取y鎖的時候,線程B鎖住了y對象準備獲取x鎖,這樣就會造成動態死鎖,你無法控制外部的傳參。
解決方法1:使用hashcode,為了避免對象重寫hashcode,使用identityHashCode方法算兩個傳入對象的hash值,每次先鎖的對象都是傳進來的對象取identityHashCode方法算出來的值小的,后鎖的都是大的。(這樣可以寫出來一個if else),如果出現hash沖突,就再設置一個自己定義的static的鎖對象,先用這把static鎖鎖住保證只有一個線程進入該方法的順序鎖階段,隨后隨便設定鎖入參a,b即可,因為你保證了只有一個線程操作這個階段。
解決辦法2:
使用顯示鎖里的trylock方法,得不到鎖的話就進行釋放
總結
以上是生活随笔為你收集整理的java中动态顺序死锁问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sentinel里的双检锁
- 下一篇: 记sentinel里防止多并发下读取脏数