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

溫馨提示×

溫馨提示×

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

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

java如何定位死鎖

發布時間:2021-09-06 17:33:57 來源:億速云 閱讀:204 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關java如何定位死鎖,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    死鎖

    死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

    死鎖發生的原因

    死鎖的發生是由于資源競爭導致的,導致死鎖的原因如下:

    • 系統資源不足,如果系統資源充足,死鎖出現的可能性就很低。

    • 進程(線程)運行推進的順序不合適。

    • 資源分配不當等。

    死鎖發生的條件

    死鎖的發生的四個必要條件:

    1. 互斥條件:一個資源每次只能被一個進程使用。

    2. 占有且等待:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

    3. 不可強行占有:進程(線程)已獲得的資源,在未使用完之前,不能強行剝奪。

    4. 循環等待條件:若干進程(線程)之間形成一種頭尾相接的循環等待資源關系。

    這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

    1:通過jstack定位死鎖信息

    1.1:編寫死鎖代碼

    Lock lock1 = new ReentrantLock();
      Lock lock2 = new ReentrantLock();
      
      ExecutorService exectuorService = Executors.newFixedThreadPool(2);
      
      exectuorService.submit(() -> {
         lock1.lock();
         try{
             Thread.sleep(1000);
         }catch(Exception e){}
         try{}
         finally{
           lock1.unlock();
           lock2.unlock();
         }
      });
      exectuorService.submit(() -> {
         lock2.lock();
         try{
            Thread.sleep(1000);
         }catch(Exception e){}
         
         try{}
         finally{
             lock1.unlock();
             lock2.unlock();
         }
      });

    1.2:查看死鎖線程的pid

    • jps查看死鎖的線程pid

    • 使用 jstack -l pid 查看死鎖信息

    • 通過打印信息我們可以找到發生死鎖的代碼是在哪個位置

    "DestroyJavaVM" #13 prio=5 os_prio=31 tid=0x00007f9a1d8fe800 nid=0xd03 waiting on condition [0x0000000000000000]
       java.lang.Thread.State: RUNNABLE
    
       Locked ownable synchronizers:
     - None
    
    "pool-1-thread-2" #12 prio=5 os_prio=31 tid=0x00007f9a1d8fe000 nid=0xa703 waiting on condition [0x000070000ff8e000]
       java.lang.Thread.State: WAITING (parking)
     at sun.misc.Unsafe.park(Native Method)
     - parking to wait for  <0x0000000795768cd8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
     at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
     at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
     at com.coco.util.SlideTimeUnit.lambda$main$1(SlideTimeUnit.java:63)
     at com.coco.util.SlideTimeUnit$$Lambda$2/565760380.run(Unknown Source)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
     at java.lang.Thread.run(Thread.java:748)
    
       Locked ownable synchronizers:
     - <0x0000000795768d08> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
     - <0x0000000795a9e4e0> (a java.util.concurrent.ThreadPoolExecutor$Worker)
    
    "pool-1-thread-1" #11 prio=5 os_prio=31 tid=0x00007f9a2082c800 nid=0xa803 waiting on condition [0x000070000fe8b000]
       java.lang.Thread.State: WAITING (parking)
     at sun.misc.Unsafe.park(Native Method)
     - parking to wait for  <0x0000000795768d08> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
     at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
     at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
     at com.coco.util.SlideTimeUnit.lambda$main$0(SlideTimeUnit.java:49)
     at com.coco.util.SlideTimeUnit$$Lambda$1/596512129.run(Unknown Source)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
     at java.lang.Thread.run(Thread.java:748)
    
       Locked ownable synchronizers:
     - <0x0000000795768cd8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
     - <0x0000000795a9ba28> (a java.util.concurrent.ThreadPoolExecutor$Worker)
    
    "Service Thread" #10 daemon prio=9 os_prio=31 tid=0x00007f9a2082c000 nid=0x4103 runnable [0x0000000000000000]
       java.lang.Thread.State: RUNNABLE
    
       Locked ownable synchronizers:
     - None
    
    "C1 CompilerThread3" #9 daemon prio=9 os_prio=31 tid=0x00007f9a1e021800 nid=0x3f03 waiting on condition [0x0000000000000000]
       java.lang.Thread.State: RUNNABLE

    2:通過Arthas工具定位死鎖

    2.1: 下載好Arthas的jar,然后運行

    有一個 thread -b 就可以查看到死鎖信息

    [arthas@4182]$ thread -b
    "pool-1-thread-2" Id=12 WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@2cb8a9a3 owned by "pool-1-thread-1" Id=11
        at sun.misc.Unsafe.park(Native Method)
        -  waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@2cb8a9a3
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
        at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
        at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
        at com.coco.util.SlideTimeUnit.lambda$main$1(SlideTimeUnit.java:63)
        at com.coco.util.SlideTimeUnit$$Lambda$2/565760380.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    
        Number of locked synchronizers = 2
        - java.util.concurrent.ThreadPoolExecutor$Worker@6433a2
        - java.util.concurrent.locks.ReentrantLock$NonfairSync@3a855d13 <---- but blocks 1 other threads!

    3. 通過 Jvisualvm 定位死鎖

    Jvisualvm 是一種自帶的可視化工具,往往在在本地執行。

    通過 Jvisualvm 命令打開軟件,選中進程,進入線程視圖,會給出死鎖提示:

    java如何定位死鎖

    死鎖的預防

    • 盡量避免使用多個鎖,并且只有需要時才持有鎖。

    • 如果使用多個鎖,一定要設計好鎖的獲取順序。

    • 使用帶有超時的方法,為程序帶來更多的可控性,比如指定獲取鎖的時間最多為5秒,超時就放棄。

    • 通過一些代碼靜態檢查工具發現可能存在的死鎖問題,比如FindBugs。

    關于“java如何定位死鎖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

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

    AI

    阳泉市| 建始县| 崇左市| 永新县| 武义县| 阳泉市| 宁陵县| 桦川县| 金沙县| 株洲市| 德令哈市| 津市市| 芮城县| 商丘市| 黄石市| 陇西县| 阿拉善盟| 临清市| 余干县| 漯河市| 蕲春县| 微山县| 项城市| 厦门市| 如皋市| 洞头县| 镇宁| 绥阳县| 双城市| 普陀区| 秦皇岛市| 庄河市| 高邑县| 海南省| 广宗县| 年辖:市辖区| 宁乡县| 保亭| 都昌县| 左贡县| 苏州市|