91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java死鎖問題的排查和解決方案

發布時間:2021-09-09 18:49:02 來源:億速云 閱讀:195 作者:chen 欄目:編程語言

本篇內容介紹了“Java死鎖問題的排查和解決方案”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1、為什么會出現死鎖?

要解決Java死鎖就必須追根究底,為什么會出現死鎖?其實從死鎖的定義就可以看出來,一方面是因為有兩個或者兩個以上進程,另一方面是因為有競爭資源。

2、怎么排查代碼中出現了死鎖?

(1)使用 jps + jstack

在windons命令窗口,使用jps -l

使用 jstack -l 12316

(2)使用jconsole

在window打開 JConsole,JConsole是一個圖形化的監控工具!

在windons命令窗口 ,輸出JConsole

選擇到線程的tab上

(3)使用Java Visual VM

在window打開 jvisualvm,jvisualvm是一個圖形化的監控工具!

在windons命令窗口 ,輸出 jvisualvm

依然是切換到線程這個TAB上,很明顯的就有提示!

3、如何避免死鎖?

上面說了死鎖出現的原因以及通過三種方式來檢測和排查死鎖,下面更重要的東西來了,就是如何避免死鎖,如果能夠讓寫出的代碼避免死鎖出現也就沒有上面這些排查的過程了。最好的是從源頭控制問題,而不是后期遇到問題在去填坑。
我看了阿里巴巴中最新的開發規約,里面有對避免死鎖的說明,具體如下:

死鎖的原因就是兩個線程試圖以不同的順序來獲得相同的鎖。所以,如果所有的線程以固定的順序來獲得鎖,那么在程序中就不會出現鎖順序死鎖的問題。

(1)動態的鎖順序死鎖

以一個經典的轉賬案例來進行說明,我們知道轉賬就是將資金從一個賬戶轉入另一個賬戶。在開始轉賬之前,首先需要獲得這兩個賬戶對象得鎖,以確保通過原子方式來更新兩個賬戶中的余額,同時又不破壞一些不變形條件,例如 賬戶的余額不能為負數。

結論:由于我們無法控制transferMoney中的參數的順序,而這些參數順序取決于外部的輸入。所以兩個線程同時調用transferMoney,一個線程從X向Y轉賬,另一個線程從Y向X轉賬,那么就會發生互相等待鎖的情況,導致死鎖。

解決問題方案:定義鎖的順序,并且整個應用中都按照這個順序來獲取鎖。

方案一:使用System.identityHashCode方法,該方法返回有Object.hashCode返回的值,此時可以通過某種任意方法來決定鎖的順序。但是在極少數情況下,兩個對象可能擁有相同的散列值,在這種情況下,通過給公共變量加鎖來實現給鎖制定順序。所以這種方法也是用最小的代價,換來了最大的安全性。

方案二:在Account中包含一個唯一的,不可變的,值。比如說賬號等。通過對這個值對對象進行排序。

(2)在協作對象之間發生的死鎖

如果在持有鎖時調用某外部的方法,那么將出現活躍性問題。在這個外部方法中可能會獲取其他的鎖(這個可能產生死鎖),或阻塞時間過長,導致其他線程無法及時獲得當前持有的鎖。

場景如下:Taxi代表出租車對象,包含當前位置和目的地。Dispatcher代表車隊。當一個線程收到GPS更新事件時掉用setLocation,那么它首先更新出租車的位置,然后判斷它是否到達目的地。如果已經到達,它會通知Dispatcher:它需要一個新的目的地。因為setLocation和notifyAvailable都是同步方法,因此掉用setLocation線程首先獲取taxi的鎖,然后在獲取Dispatcher的鎖。同樣,掉用getImage的線程首先獲取Dispatcher的鎖,再獲取每一個taxi的鎖,這兩個線程按照不同的順序來獲取鎖,因此可能導致死鎖。

解決方案:使用開放掉用。如果再調用某個方法時不需要持有鎖,那么這種調用就被稱為開放掉用。這種調用能有效的避免死鎖,并且易于分析線程安全。

“Java死鎖問題的排查和解決方案”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴隆县| 奉节县| 四会市| 兴化市| 陵川县| 慈溪市| 杭锦旗| 东至县| 溧水县| 光泽县| 龙南县| 大同县| 吉木萨尔县| 富阳市| 玉龙| 垫江县| 宁津县| 扶余县| 武乡县| 洛扎县| 绥棱县| 盐津县| 环江| 靖江市| 蓝田县| 榆社县| 方城县| 阿勒泰市| 盐山县| 苏尼特右旗| 天等县| 吴旗县| 黑龙江省| 汪清县| 高碑店市| 高青县| 青州市| 长葛市| 宁德市| 石景山区| 五台县|