死鎖原因
Java發生死鎖的根本原因是:在申請鎖時發生了交叉閉環申請。即執行緒在獲得了鎖A並且沒有釋放的情況下去申請鎖B,這時,另一個執行緒已經獲得了鎖B,在釋放鎖B之前又要先獲得鎖A,因此閉環發生,陷入死鎖迴圈。
監控死鎖
VisualVM監控工具有明顯執行緒死鎖提醒,也可監控到發生死鎖的執行緒、類、程式碼行數、資料型別。
分析死鎖
- VisualVM生成threaddump,查詢死鎖程式碼塊記憶體地址
- VisualVM生成heapdump, 使用OQL檢視被死鎖物件的值和引用
select heap.findObject("0x00000006c0276428")
- 使用OQL的另一種方法
jmap -dump:live,file=/data/test.map <jps埠號>
jhat /data/test.map
瀏覽器訪問 http://ip:7000/
示例程式碼
/*
* 執行緒死鎖等待演示
*/
static class SynAddRunalbe implements Runnable {
int a, b;
public SynAddRunalbe(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
}
public static void main(String[] args) throws Exception {
for (int i=0;i< 100; i++) {
new Thread(new SynAddRunalbe(1, 2)).start();
new Thread(new SynAddRunalbe(2, 1)).start();
}
}
掃一掃,關注我