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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 死锁

發布時間:2023/12/4 java 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 死锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

  • 什么是死鎖?
  • 死鎖是怎么產生的?
  • 怎么排查死鎖?
  • 死鎖的預防
  • 拓展:Java CPU 100%排查
  • 一 什么是死鎖?

    注:線程和進程都可能會產生死鎖,以下以線程為例

    死鎖是指兩個或兩個以上的線程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象, 若無外力作用,它們都將無法推進下去。 此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的線程稱為死鎖線程。

    另一種定義:
    集合中的每個線程都在等待只能由本集合內的其他線程才能引發的事件,那么該組線程是死鎖的。

    競爭的資源可以是:鎖、網絡連接、通知事件,磁盤、帶寬,以及一切可以被稱作“資源”的東西。

    二 死鎖是怎么產生的?

    死鎖的主要產生原因:

  • 系統資源不足
  • 進程/線程運行的順序不當
  • 資源分配不當
  • 產生死鎖的四個必要條件:

  • 互斥條件:一個資源每次只能被一個線程使用
  • 請求與保持條件:一個線程因請求資源而阻塞時,對已獲得的資源保持不放
  • 不剝奪條件:線程已獲得的資源,在未使用完之前,不能強行剝奪
  • 循環等待條件:若干進程之間形成一種頭尾相連的循環等待資源關系
  • 這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會產生死鎖

    常見死鎖

    避免死鎖的一個通用的經驗法則是

    當多個線程都要訪問資源A、B、C時,保證使每個線程都按照同樣的順序去訪問它們,
    即:讓所有線程按照同樣的順序獲得一組鎖

    三、怎么排查死鎖

    首先,編寫一個死鎖程序:

    public static void main(String[] args) {final Object a = new Object();final Object b = new Object();Thread threadA = new Thread(new Runnable() {public void run() {synchronized (a) {try {System.out.println("now i in threadA-locka");Thread.sleep(1000l);synchronized (b) {System.out.println("now i in threadA-lockb");}} catch (Exception e) {// ignore}}}});Thread threadB = new Thread(new Runnable() {public void run() {synchronized (b) {try {System.out.println("now i in threadB-lockb");Thread.sleep(1000l);synchronized (a) {System.out.println("now i in threadB-locka");}} catch (Exception e) {// ignore}}}});threadA.start();threadB.start();}

    上面的代碼執行后,就會出現死鎖,排查方法如下:

    方式1:使用jps + jstack

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

    第二:在windons命令窗口,使用 jstack -l 9004


    死鎖信息如上圖,結合代碼看就可以找出原因了。

    方式2:使用jconsole

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


    四、死鎖預防:

    遇見問題,解決問題是一般人的思維。高手都是提前預見問題,并有效預防。

    死鎖的常見預防思路如下:

  • 以確定的順序獲得鎖
  • 超時放棄
  • 當使用synchronized關鍵字提供的內置鎖時,只要線程沒有獲得鎖,就會永遠等待下去。
    然而Lock接口提供了:

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException

    該方法可以按照固定時間等待鎖,所以線程可以在獲取鎖超時時,主動釋放之前已經獲得的所有的鎖。

    五、拓展:
    Java CPU 100%排查

    見:https://blog.csdn.net/u010648555/article/details/80721815

    總結

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

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