1. 程式人生 > >Java模擬排查執行緒死鎖問題

Java模擬排查執行緒死鎖問題

一、模擬死鎖

public class App 
{
    public static void main( String[] args )
    {
        Object object1 = new Object();
        Object object2 = new Object();

        System.out.println("main thread start");
        Thread thread1 = new Thread(new Task1(object1,object2));
        thread1.start();


        Thread thread2 = new Thread(new Task2(object1,object2));
        thread2.start();

        System.out.println("main thread end");

    }

}

class Task1 implements Runnable {

    private Object curObj1;
    private Object curObj2;

    public Task1 (Object obj1,Object obj2) {
        this.curObj1 = obj1;
        this.curObj2 = obj2;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName() + " start");

        synchronized (curObj1) {
            System.out.println(Thread.currentThread().getName() + " get lock on Object1");

            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (curObj2) {
                System.out.println(Thread.currentThread().getName() + " get lock on Object2");
            }

        }

        System.out.println(Thread.currentThread().getName() + " end");
    }
}

class Task2 implements Runnable {

    private Object curObj1;
    private Object curObj2;

    public Task2 (Object obj1,Object obj2) {
        this.curObj1 = obj1;
        this.curObj2 = obj2;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName() + " start");

        synchronized (curObj2) {
            System.out.println(Thread.currentThread().getName() + " get lock on Object2");

            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (curObj1) {
                System.out.println(Thread.currentThread().getName() + " get lock on Object1");
            }
        }



        System.out.println(Thread.currentThread().getName() + " end");
    }
}

1、兩個執行緒分別互相等待對方釋放物件鎖

2、打包成jar(注意在POM中加入maven-jar-plugin外掛,否則打包出來的jar在執行時會報錯找不到manifest)

3、java  -jar   jarname  執行

二、排查死鎖

1、top檢視CPU和記憶體使用率

2、找到資源佔用率比較高的程序PID

3、分析PID

4、顯示PID下面的執行緒

     top -H  -p  pid

5、檢視具體某個執行緒

     jstack -l  pid | grep  xxx -A  20

6、jvm常用命令

(1)jps 檢視啟動的JVM程序

(2)jinfo  pid 檢視某個JVM程序ClassPath、VM引數設定等

(3)jstat 檢視某個JVM程序執行狀態:GC情況等

(4)jstack 檢視某個JVM程序下所有執行緒的執行狀態

(5)jmap 檢視某個JVM程序下堆中儲存的物件

檢視結果:


相關推薦

Java模擬排查執行問題

一、模擬死鎖 public class App { public static void main( String[] args ) { Object object1 = new Object(); Object objec

VisualVM(9) 排查JAVA應用程式執行

Java虛擬機器效能管理神器 - VisualVM(9) 排查JAVA應用程式執行緒鎖 1. JAVA應用程式執行緒鎖原因 這個例子比較極端,一般情況下,出現鎖競爭激烈是比較常見的。 2. 排查JA

Java執行-47-多執行

       本篇學習什麼是多執行緒死鎖,怎麼避免執行緒死鎖。這個問題,在面試了應該也經常被提到。關於,執行緒死鎖,有這麼一個故事。一個飯桌上,有豐盛的菜餚,圓桌圍著幾個哲學家,問題來了,每個哲學家只有一根筷子。假如必須得到兩根筷子,才

Java開發之執行同步造成的執行

案例解析: 兩個人面對面過獨木橋,甲和乙都已經在橋上走了一段距離,即佔用了橋的資源,甲如果想通過獨木橋的話,乙必須退出橋面讓出橋的資源,讓甲通過,但是乙不服,為什麼讓我先退出去,我還想先過去呢,於是就僵持不下,導致誰也過不了橋,這就是死鎖。 死鎖產生情況解析: 1.互斥條件(

java執行 和valitile關鍵字

死鎖 兩個或者多個執行緒都在等待對方釋放鎖,在寫多執行緒程式碼時要注意避免這種死鎖的發生 發生死鎖後可以在dos命令列輸入jps命令檢視java程序狀況 可以試用jstack -l 程序號   命令檢視當前類的問題 關閉jvm停止死鎖   以上節

Java筆記-多執行執行問題加簡單舉例

死鎖 導致死鎖的原因 Java中死鎖最簡單的情況是,一個執行緒T1持有鎖L1並且申請獲得鎖L2,而另一個執行緒T2持有鎖L2並且申請獲得鎖L1,因為預設的鎖申請操作都是阻塞的,所以執行緒T1和T2永遠被阻塞了。導致了死鎖。 這是最容易理解也是最簡單的死

java執行例項

死鎖發生的四個必要條件:     1、互斥使用,即當資源被一個執行緒使用(佔有)時,別的執行緒不能使用     2、不可搶佔,資源請求者不能強制從資源佔有者手中奪取資源,資源只能由資源佔有者主動釋放。     3、請求和保持,即當資源請求者在請求其他的資源的同時保持對原有資

java執行 哲學家就餐問題

    現在你理解了,一個物件可以有synchronized方法或其他形式的加鎖機制來防止別的任務在互斥還沒有釋放的時候就訪問這個物件。你已經學習過,任務可以變成阻塞狀態,所以就可能出現兩種情況:某個惹我怒在等待另一個任務,而後者又等待別的任務,這樣一直下去,直到這個鏈條上

java學習第十二天之多執行和併發

package MoreThreadLearn; /* 兩個儲戶到銀行存錢,每個人存了三次,一次100元 1、描述銀行 2、描述儲戶業務 分析多執行緒是否存在安全隱患? 1、執行緒任務中是否有共享的資料 2、是否多條操作共享資料的程式碼 */ public

Java執行及解決方案

要了解執行緒死鎖,首先要明白什麼是死鎖 死鎖 通俗點講:死鎖就是兩個或兩個以上的程序或執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。 用簡單一點的例子來說吧 比如這個交通堵塞的例子,從圖中可以看到四個方向行駛

java執行安全,執行執行通訊快速入門

一:多執行緒安全問題 ###1 引入 /* * 多執行緒併發訪問同一個資料資源 * 3個執行緒,對一個票資源,出售 */ public class ThreadDemo { public static void main(String[

執行問題

1、引言   5個哲學家的故事:   5個哲學家去吃飯,菜飯都上齊了,筷子也上了,但是一人只有一隻筷子,每個人,先思考一會,把筷子借給別人,然後,別人吃完了,自己再吃。但是假如這5個人都餓了,他們就會拿起自己的筷子,而筷子只有一隻,大家都在等待這個別人放下那一隻筷子,然後

34-多執行--+執行間通訊+等待喚醒機制+多生產者多消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

java 併發(執行&

java 併發(執行緒&鎖) ##執行緒 ###執行緒概念 作業系統排程的最小單元是執行緒,也叫輕量級程序(LightWeight Process),在一個程序裡可以建立多個執行緒,這些執行緒都擁有各自的計數器、堆疊和區域性變數等屬性,並且能夠訪問共享的記憶體變數。處

java模擬執行http請求

package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import

python中的多程序,多執行,,多協程

本人根據自己的理解來總結的,如果有錯誤的地方還請各位大佬指正,謝謝了. 程序:程式是計算機可執行的二進位制資料,只有被作業系統呼叫的時候才開始它們的生命週期.程序就是程式的一次執行,擁有自己的地址空間,記憶體,程序id(pid),資料棧及其他記錄其執行軌跡的輔助資料;最小的

執行程式碼

public class DeadLock { //建立兩個物件,一個執行緒持有鎖A並且申請獲得鎖B,而另一個執行緒持有鎖B並且申請獲得鎖A就會發生死鎖。 private static final Object A=new Object(); priv

JAVA語言規範-執行章節之同步、等待和通知

原文連結  本文是Oracle官方《Java語言規範》的譯文 JAVA語言規範:執行緒和鎖 1 同步 JAVA程式語言提供了執行緒間通訊的多種機制。這些方法中最基本的是同步化,此方法是使用監視器實現的。JAVA中每個物件與一個監視器相關聯,一個執行緒可以加鎖和解鎖監視器。一次僅有一個執行緒可能

執行的產生以及如何避免

一、死鎖的定義 多執行緒以及多程序改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。 下面我們通過一些例項來說明死鎖現象。 先看生活中

VC中使用SetThreadName引起的執行

我在工程裡使用以下函式給執行緒設定一個方便除錯的名稱 typedef struct tagTHREADNAME_INFO { DWORD dwType; // must be 0x1000 LPCSTR szName; // poi