欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程之死鎖詳解

 更新時間:2021年10月26日 10:58:39   作者:不關(guān)阿強的事  
這篇文章主要介紹了Java多線程的死鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、死鎖

出現(xiàn)場景:當線程A擁有了A對象的鎖,想要去獲取B對象的鎖;線程B擁有了B對象的鎖,想要擁有A對象的鎖,兩個線程在獲取鎖的時候,都不會釋放已經(jīng)持有的鎖,于是,就造成了死鎖。

示例代碼:

@Slf4j
public class ThreadTest {
    private static Object objectA = new Object();
    private static Object objectB = new Object();
    public static void main(String[] args) throws InterruptedException {
        Thread t2 = new Thread(()->{
            synchronized (objectA){
                log.debug("線程t2獲取到了objectA");
                synchronized (objectB){
                    log.debug("線程t2獲取到了objectB");
                }
            }
        },"t2");
        Thread t1 = new Thread(()->{
            synchronized (objectB){
                log.debug("線程t1獲取到了objectB");
                synchronized (objectA){
                    log.debug("線程t1獲取到了objectA");
                }
            }
        },"t1");
        t2.start();
        t1.start();
    }
}

如何檢測死鎖:

兩種方法

(1)找到本機jconsole程序,直接在windows系統(tǒng)搜索就可以,打開是這個樣子。

然后在本地進程里面選擇你的進程,其實就是你的項目名稱。然后點擊連接,在點擊不安全連接。                

 ​​​​​​​

 進去之后點擊線程

 再點擊檢測死鎖

 

最后就能看到死鎖的線程了

 

(2)首先是在idea的控制臺,打開Terminal,輸入【jps】命令查看所有的進程id,找到你自己的java類名稱對應的id。

然后輸入【jstack + 進程號】 就可以查詢到該進程的所有線程信息。在輸出信息的最下面,就可以看到如下圖所示的線程死鎖信息。

2、死鎖經(jīng)典問題——哲學家就餐問題 

 經(jīng)典場景:有四位哲學及在一正方形的桌子上面吃飯,桌子的每個角有一根筷子,一共四根,那么,當每個哲學家都拿起自己左邊的筷子之后,再去拿自己右邊的筷子的時候,就會發(fā)現(xiàn)自己右邊沒有筷子,這時哲學就就會等右邊的哲學家放下筷子,但是每個哲學家都是這個想法,那么都不會放下筷子,并且都拿不到右邊的筷子,因此就造成了死鎖。

 代碼實現(xiàn)例子:

@Slf4j
public class Thread1 {
    public static void main(String[] args) throws InterruptedException {
        //筷子對象
        Chopsticks c1 = new Chopsticks("c1");
        Chopsticks c2 = new Chopsticks("c2");
        Chopsticks c3 = new Chopsticks("c3");
        Chopsticks c4 = new Chopsticks("c4");
        new Philosopher("李云龍",c1,c2).start();
        new Philosopher("趙剛",c2,c3).start();
        new Philosopher("魏和尚",c3,c4).start();
        new Philosopher("張大彪",c4,c1).start();
    }
}
//筷子
class  Chopsticks{
    private String name;
 
    public Chopsticks(String name) {
        this.name = name;
    }
}
//哲學家
@Slf4j
class Philosopher extends Thread{
    //名字
    private String name;
    //筷子
    private Chopsticks left;
    private Chopsticks right;
 
    public Philosopher(String name, Chopsticks left, Chopsticks right) {
        super(name);
        this.left = left;
        this.right = right;
    }
 
    @Override
    public void run() {
        while(true){
            synchronized (right){
                synchronized (left){
                    eat(name);
                }
            }
        }
    }
    private void eat(String name){
        log.debug(name + "正在吃飯");
    }
}

 測試結(jié)果:可以實現(xiàn)吃飯操作,但是會出現(xiàn)場景中描述的問題,出現(xiàn)線程死鎖。

 

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java.net.MalformedURLException異常的解決方法

    java.net.MalformedURLException異常的解決方法

    下面小編就為大家?guī)硪黄猨ava.net.MalformedURLException異常的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot+MybatisPlus+代碼生成器整合示例

    SpringBoot+MybatisPlus+代碼生成器整合示例

    這篇文章主要介紹了SpringBoot+MybatisPlus+代碼生成器整合示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • springboot實現(xiàn)定時器(一看即會,非常簡單)

    springboot實現(xiàn)定時器(一看即會,非常簡單)

    這篇文章主要介紹了springboot實現(xiàn)定時器(一看即會,非常簡單),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringSecurity-2.7中跨域問題解析

    SpringSecurity-2.7中跨域問題解析

    這篇文章主要介紹了SpringSecurity-2.7中跨域問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 老生常談Java中instanceof關(guān)鍵字的理解

    老生常談Java中instanceof關(guān)鍵字的理解

    java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。這篇文章主要介紹了老生常談Java中instanceof關(guān)鍵字的理解,需要的朋友可以參考下
    2018-10-10
  • 基于SpringBoot實現(xiàn)發(fā)送帶附件的郵件

    基于SpringBoot實現(xiàn)發(fā)送帶附件的郵件

    這篇文章主要介紹了基于SpringBoot實現(xiàn)發(fā)送帶附件的郵件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java圖形驗證碼生成工具類 web頁面校驗驗證碼

    java圖形驗證碼生成工具類 web頁面校驗驗證碼

    這篇文章主要為大家詳細介紹了java圖形驗證碼生成工具類,web頁面校驗驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java實現(xiàn)全排列的三種算法詳解

    Java實現(xiàn)全排列的三種算法詳解

    從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。本文總結(jié)了Java實現(xiàn)全排列的三種算法,需要的可以參考下
    2022-06-06
  • Java中String類使用方法總結(jié)

    Java中String類使用方法總結(jié)

    這篇文章主要介紹了Java中String類的使用方法,文章簡單易懂,結(jié)尾有實例代碼幫助大家理解學習,感興趣的朋友可以了解下
    2020-06-06
  • SpringSecurity實現(xiàn)權(quán)限認證與授權(quán)的使用示例

    SpringSecurity實現(xiàn)權(quán)限認證與授權(quán)的使用示例

    本文主要介紹了SpringSecurity實現(xiàn)權(quán)限認證與授權(quán)的使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11

最新評論