Java多線程環(huán)境下死鎖模擬
1、死鎖產(chǎn)生的條件
- 互斥:一次只有一個進程可以使用一個資源。其他進程不能訪問已分配給其他進程的資源。
- 不可搶占:不能搶占進程已占有的資源
- 請求和保持:當一個進程等待其他進程釋放資源時,繼續(xù)占有已經(jīng)分配的資源
- 循環(huán)等待:存在一個封閉的進程鏈,使得每個進程至少占有此鏈中下一個進程所需要的一個資源。
注意:前三個條件都只是死鎖存在的必要條件,但不是充分條件。第四個條件是充分條件。以上條件同樣適用于線程。
2、模擬多線程環(huán)境下死鎖的產(chǎn)生
/**
* 死鎖產(chǎn)生的四個條件:互斥 請求和保持 不可搶占 循環(huán)等待
* synchronized鎖住對象資源,保證互斥和不可搶占
* 先持有一個資源,再去申請另一個資源->請求和保持
*/
public class DeadLock {
// 模擬兩個資源
public static Object lock1 = new Object();
public static Object lock2 = new Object();
// 先申請lock1資源,再去申請lock2資源
public static void getLock1First(){
synchronized (lock1){
System.out.println("getlock1");
getLock2();
}
}
public static void getLock2(){
synchronized (lock2) {
System.out.println("lock1->lock2");
}
}
// 先申請lock2資源,再申請lock1資源
public static void getlock2First(){
synchronized (lock2){
System.out.println("getlock2");
getLock1();
}
}
public static void getLock1(){
synchronized (lock1){
System.out.println("lock2->lock1");
}
}
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
// 太難把控線程運行的時機了 也有可能此線程執(zhí)行完了lock1->lock2的順序
// 直接死循環(huán)一直運行
// 總會剛好遇到線程1剛好獲得lock1,線程2剛好獲得lock2
while (true){
getLock1First();
}
}
}.start();
new Thread(){
@Override
public void run() {
while (true){
getlock2First();
}
}
}.start();
}
}
死鎖:

3、死鎖的排查
先進入jdk安裝的bin目錄,啟動命令行,輸入命令jps查看運行的線程ID
死鎖檢測1:

執(zhí)行jstack -l 線程ID命令
死鎖檢測2:

可以看到Thread-1和Thread-2都在相互等待對方持有的對象的monitor鎖釋放。
到此這篇關于Java多線程環(huán)境下死鎖模擬的文章就介紹到這了,更多相關Java多線程死鎖模擬內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java鏈式創(chuàng)建json對象的實現(xiàn)
本文主要介紹了java中如何通過最簡單的方式實現(xiàn)鏈式創(chuàng)建json對象,解決創(chuàng)建json代碼臃腫的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的實例代碼
WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù),下面這篇文章主要給大家介紹了關于SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的相關資料,需要的朋友可以參考下2023-03-03
Spring Security 在 Spring Boot 中的使用詳解【集中式】
這篇文章主要介紹了Spring Security 在 Spring Boot 中的使用【集中式】,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Mybatis?Mapper中多參數(shù)方法不使用@param注解報錯的解決
這篇文章主要介紹了Mybatis?Mapper中多參數(shù)方法不使用@param注解報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01
Java8新特性之Collectors.joining()實例詳解
在項目中我們常常要對list集合的數(shù)據(jù)做一些字符串拼接/處理等相關操作,下面這篇文章主要給大家介紹了關于Java8新特性之Collectors.joining()的相關資料,需要的朋友可以參考下2023-01-01
智能 AI 代碼生成工具 Cursor 安裝和使用超詳細教程
Cursor.so 是一個集成了 GPT-4 的國內直接可以訪問的,優(yōu)秀而強大的免費代碼生成器,可以幫助你快速編寫、編輯和討論代碼,這篇文章主要介紹了智能 AI 代碼生成工具 Cursor 安裝和使用介紹,需要的朋友可以參考下2023-05-05

