国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java多線程之死鎖詳解

Java多線程之死鎖詳解

2022-03-01 00:36不關阿強的事 Java教程

這篇文章主要介紹了Java多線程的死鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、死鎖

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

示例代碼:

@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系統搜索就可以,打開是這個樣子。

Java多線程之死鎖詳解

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

???????Java多線程之死鎖詳解

進去之后點擊線程

Java多線程之死鎖詳解

再點擊檢測死鎖

Java多線程之死鎖詳解

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

Java多線程之死鎖詳解

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

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

Java多線程之死鎖詳解

 

2、死鎖經典問題――哲學家就餐問題

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

代碼實現例子:

@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 + "正在吃飯");
  }
}

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

Java多線程之死鎖詳解

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/qq_42251944/article/details/120879781

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲高清视频在线 | 激情综合网激情 | 久久久午夜爽爽一区二区三区三州 | 欧美在线播放一区 | 精品视频三区 | 伊人网综合 | 日韩一区二区在线播放 | 青青草视频在线免费观看 | 日本在线不卡视频 | 91视频免费网站 | 亚洲天堂黄色 | 精品一区视频 | 久久久久久国产精品mv | 日韩福利在线 | 天天干一干 | 亚洲电影二区 | 精品无人乱码一区二区三区的优势 | 亚洲经典一区 | 久久精品国产清自在天天线 | 91社区在线观看 | 国产高清免费 | 第一色网站 | 国产成人精品一区二区三区四区 | 久久久久久久av | 国产精品视频久久久 | 日韩视频中文字幕 | 中文字幕一区二区三区不卡 | 欧美综合在线观看 | 草久久| av免费网站在线观看 | 99视频网| 一区二区在线免费观看 | 精品日韩一区二区 | 日韩欧美在线视频 | 草草视频在线观看 | 国产成人精品久久二区二区 | 激情综合网激情 | 午夜伦理影院 | 国产一区日韩精品 | 亚洲欧洲视频在线 | 亚洲精品影院 |