摘要:如何分析造成多線程的原因呢很多時候我們在懷疑造成死鎖的語句設(shè)置斷點,單步調(diào)試,反而又不能重現(xiàn)了。有了,程序員不用對著冗長燒腦的多線程代碼去冥思苦想了,會自動把死鎖原因打印出來,太方便了。
Java多線程編程也是Java面試中經(jīng)常考察的內(nèi)容。剛接觸Java多線程編程的朋友們,可能會不慎寫出一些會導(dǎo)致死鎖(deadlock)的應(yīng)用出來。如何分析造成Java多線程的原因呢?很多時候我們在懷疑造成死鎖的語句設(shè)置斷點,單步調(diào)試,反而又不能重現(xiàn)了。這種現(xiàn)象很正常,因為咱們單步調(diào)試和直接運行程序,代碼執(zhí)行的時序是不同的,很可能無法滿足死鎖的觸發(fā)條件。
實際上,JDK已經(jīng)給Java程序員提供了強大的死鎖分析工具,能夠直接分析一個正在運行的并且處于死鎖狀態(tài)的應(yīng)用,并給出具體是哪一行Java代碼引起的死鎖。
這篇文章就以一個例子來給大家演示如何使用這個JDK提供的標準工具。
這個工具叫jstack,就是JDK安裝目錄的bin文件夾下的一個執(zhí)行文件。
我們首先寫一個會導(dǎo)致死鎖的應(yīng)用出來。
public class DeadLockExample { public static void main(String[] args) { final String resource1 = "ABAP"; final String resource2 = "Java"; Thread t1 = new Thread() { public void run() { synchronized (resource1) { System.out.println("Thread 1: locked resource 1"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource2) { System.out.println("Thread 1: locked resource 2"); } } } } ; Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println("Thread 2: locked resource 2"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource1) { System.out.println("Thread 2: locked resource 1"); } } } } ; t1.start(); t2.start(); } }
這個應(yīng)用思路很簡單,同時啟動兩個線程,分別鎖住了resource1和resource2,然后休眠0.1秒,接著分別嘗試去請求資源resource2和resource1。
執(zhí)行應(yīng)用,在控制臺打印出下列輸出后,進入死鎖狀態(tài):
Thread 1: locked resource 1
Thread 2: locked resource 2
使用命令行 jps -l -m找到處于死鎖狀態(tài)應(yīng)用的進程id。從下圖得知死鎖進程為51476:
然后使用命令行jstack 51476打印這個進程的運行棧信息。
我上圖紅色高亮出的 0x00000000d6f64988 和 0x00000000d6f649b8代表了代碼中的兩個資源“ABAP” 和“Java”。
jstack打印的輸出非常清晰,顯示了具體哪行Java代碼試圖去鎖定哪一個Java資源(下圖的waiting to lock)但是沒有成功, 并且將失敗的原因,即擁有當前請求資源的線程名稱也打印了出來。
有了jstack,Java程序員不用對著冗長燒腦的多線程代碼去冥思苦想了,JDK會自動把死鎖原因打印出來,太方便了。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71821.html
摘要:采用的生成非波拉契數(shù)列提供了原生的支持,語法非常有特色,關(guān)鍵字后面緊跟一個星號。的詳細介紹參考官網(wǎng)先看如何用這個黑科技重新實現(xiàn)非波拉契樹立的生成。在這個內(nèi)部,我們定義了一個無限循環(huán),用于計算非波拉契數(shù)列。 程序員面試系列 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請求的原因? Java程序員面試系列-什么...
摘要:此時線程需要鎖才能繼續(xù)往下執(zhí)行。但是線程的鎖并沒有釋放,線程的鎖也沒有釋放。 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍 Java鎖機制了解一下 AQS簡簡單單過一遍 Lock鎖子類了解一下 線程池你真不來了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...
摘要:橋接模式的核心在于將抽象部分和它的實現(xiàn)部分分離,使它們都可以獨立的變化。看起來這個版本已經(jīng)很完美了不,它仍然有可以優(yōu)化的空間,即題目提到的橋接模式。使用橋接模式的實現(xiàn)版本這個實現(xiàn)包含了三個函數(shù)。這個例子體現(xiàn)了橋接模式的作用。 我寫的程序員面試系列文章 Java面試系列-webapp文件夾和WebContent文件夾的區(qū)別? 程序員面試系列:Spring MVC能響應(yīng)HTTP請求的原因?...
摘要:點擊進入我的博客命令行工具這些工具大多數(shù)是類庫的一層薄的包裝,它們的主要功能代碼是在類庫中實現(xiàn)的。可視化工具是到目前為止隨發(fā)布的功能最強大的運行監(jiān)視和故障處理程序,并且可以預(yù)見在未來一段時間內(nèi)都是官方主力發(fā)展的虛擬機故障處理工具。 點擊進入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
摘要:線程的優(yōu)先級代表線程的優(yōu)先級為線程代表線程為,而代表該線程對應(yīng)的操作系統(tǒng)級別的線程。若是有運行圖形界面的環(huán)境,也可以使用一些圖形化的工具,例如來生成線程棧文件。使用線程棧定位問題發(fā)現(xiàn)死鎖當兩個或多個線程正在等待被對方占有的鎖,死鎖就會發(fā)生。 什么是線程棧(thread dump) 線程棧是某個時間點,JVM所有線程的活動狀態(tài)的一個匯總;通過線程棧,可以查看某個時間點,各個線程正在做什么...
閱讀 1119·2021-11-23 09:51
閱讀 1084·2021-10-18 13:31
閱讀 2997·2021-09-22 16:06
閱讀 4286·2021-09-10 11:19
閱讀 2208·2019-08-29 17:04
閱讀 437·2019-08-29 10:55
閱讀 2486·2019-08-26 16:37
閱讀 3382·2019-08-26 13:29