這是我學習java併發編程做的筆記,附上原課程B站地址:全面深入學習java併發編程,中級程序員進階必會
1.簡單的死鎖程序
以下代碼會導致一個死鎖: t1線程鎖住A對象後申請B對象的鎖,t2線程鎖住B對象後申請A對象鎖,產生矛盾,導致死鎖。
將此代碼運行,然後下一步
/**
*死鎖的演示與排查
*
* */
@Slf4j(topic = "c.Test2")
public class Test2 {
private static final Object A = new Object();
private static final Object B = new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (A){
log.debug("鎖住A...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
log.debug("鎖住B...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1").start();
new Thread(()->{
synchronized (B){
log.debug("鎖住B...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (A){
log.debug("鎖住A...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t2").start();
}
}
2.打開Terminal,輸入jps
點擊打開terminal工具,輸入jps,查看進程id
3.找到對應線程,輸入jstack 對應id
如下:
4.查看打印的信息
下圖的意思就是,t2鎖住了f98的一個對象,需要一個f88的
下圖的意思就是,t1鎖住了f88的一個對象,需要一個f98的,綜合上面的圖,就知道倆兄弟意見不合,各要對方的資源,然後就尬住了,即死鎖。
當然,懶得分析上面獨立的信息也可以往下滑
底下直接就幫你分析好了
以上就是所有啦,告辭我繼續滾去學習了。