日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中动态顺序死锁问题

發布時間:2024/4/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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即可,因為你保證了只有一個線程操作這個階段。

private static Object tieLock = new Object();public void deadLockTest(Object a, Object b) {int hashA = System.identityHashCode(a);int hashB = System.identityHashCode(b);if (hashA < hashB) {synchronized (a) {System.out.println("鎖住了小的準備獲取大的");synchronized (b) {System.out.println("獲取到了hash大的");}}} else if (hashB < hashA) {synchronized (b) {System.out.println("鎖住了小的準備獲取大的");synchronized (a) {System.out.println("獲取到了hash大的");}}} else {synchronized (tieLock){synchronized (a){synchronized (b){}}}}}

解決辦法2:
使用顯示鎖里的trylock方法,得不到鎖的話就進行釋放

總結

以上是生活随笔為你收集整理的java中动态顺序死锁问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。