最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java模擬死鎖發(fā)生之演繹哲學家進餐問題案例詳解

 更新時間:2019年10月23日 09:09:21   作者:cakincqm  
這篇文章主要介紹了Java模擬死鎖發(fā)生之演繹哲學家進餐問題,結合具體演繹哲學家進餐問題的案例形式詳細分析了死鎖機制與原理,需要的朋友可以參考下

本文實例講述了Java模擬死鎖發(fā)生之演繹哲學家進餐問題。分享給大家供大家參考,具體如下:

一 點睛

常見的死鎖形式:當線程1已經占據(jù)資源R1,并持有資源R1上的鎖,而且還在等待資源R2的鎖;而線程2已經占據(jù)資源R2,并且持有資源R2上的鎖,卻正在等待資源R1上的鎖。如果兩個線程不釋放自己占據(jù)的資源鎖,而且還申請對方資源上的鎖,申請不到時只能等待,而且它們只能永遠的等待下去。

二 實戰(zhàn)

1 代碼

public class DeadLockDemo
{
  /** knife鎖 */
  private static String knife = "餐刀"; //臨界資源
  /** fork鎖 */
  private static String fork = "叉子"; //臨界資源
  public static void main(String[] args)
  {
    DaemonThread daemonTh = new DaemonThread();
    Thread newDaemon = new Thread(daemonTh);
    newDaemon.setDaemon(true);
    newDaemon.start();
    new DeadLockDemo().deadLock();
  }
  private void deadLock()
  {
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run()
      {
        synchronized (knife) {
          System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......");
          try {
            Thread.sleep(2000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          synchronized (fork) {
            System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中...");
          }
        }
      }
    });
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        synchronized (fork) {
          System.out.println(Thread.currentThread().getName() + "拿起了" + fork + ", 等待" + knife + "......");
          synchronized (knife) {
            System.out.println(Thread.currentThread().getName() + "又拿起了" + knife + ",吃飯中...");
          }
        }
      }
    });
    t1.start();
    t2.start();
  }
}
class DaemonThread implements Runnable
{
  @Override
  public void run()
  {
    while(true)
    {
      try {
        Thread.sleep(1000);
      }catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("守護線程:程序仍在運行中...");
    }
  }
}

2 運行

Thread-1拿起了餐刀, 等待叉子......
Thread-2拿起了叉子, 等待餐刀......
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...

三 預防死鎖

1 解決方法

如果規(guī)定線程A和B都必須先拿刀,再拿叉,就不會發(fā)生死鎖。

2 代碼

public class DeadLockDemo
{
  /** knife鎖 */
  private static String knife = "餐刀"; //臨界資源
  /** fork鎖 */
  private static String fork = "叉子"; //臨界資源
  public static void main(String[] args)
  {
    DaemonThread daemonTh = new DaemonThread();
    Thread newDaemon = new Thread(daemonTh);
    newDaemon.setDaemon(true);
    newDaemon.start();
    new DeadLockDemo().deadLock();
  }
  private void deadLock()
  {
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run()
      {
        synchronized (knife) {
          System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......");
          try {
            Thread.sleep(2000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          synchronized (fork) {
            System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中...");
          }
        }
      }
    });
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        synchronized (knife) {
          System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......");
          synchronized (fork) {
            System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中...");
          }
        }
      }
    });
    t1.start();
    t2.start();
  }
}
class DaemonThread implements Runnable
{
  @Override
  public void run()
  {
    while(true)
    {
      try {
        Thread.sleep(1000);
      }catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("守護線程:程序仍在運行中...");
    }
  }
}

3 運行

Thread-1拿起了餐刀, 等待叉子......
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
Thread-1又拿起了叉子,吃飯中...
Thread-2拿起了餐刀, 等待叉子......
Thread-2又拿起了叉子,吃飯中...

更多java相關內容感興趣的讀者可查看本站專題:《Java進程與線程操作技巧總結》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • java中全排列的生成算法匯總

    java中全排列的生成算法匯總

    本文給大家匯總介紹了常見的6種全排列的生成算法,包括字典序法、遞增進位數(shù)制法、遞減進位數(shù)制法、鄰位交換法、遞歸類算法、元素增值法,有需要的小伙伴可以參考下
    2015-07-07
  • Spring Bean的定義及三種創(chuàng)建方式

    Spring Bean的定義及三種創(chuàng)建方式

    本文主要介紹了Spring容器獲取Bean的9種方式小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • java web實現(xiàn)簡單聊天室

    java web實現(xiàn)簡單聊天室

    這篇文章主要為大家詳細介紹了java-web實現(xiàn)簡單聊天室,含拍一拍功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • SpringMVC九大組件之HandlerMapping詳解

    SpringMVC九大組件之HandlerMapping詳解

    這篇文章主要介紹了SpringMVC九大組件之HandlerMapping詳解,HandlerMapping 叫做處理器映射器,它的作用就是根據(jù)當前 request 找到對應的 Handler 和 Interceptor,然后封裝成一個 HandlerExecutionChain 對象返回,需要的朋友可以參考下
    2023-09-09
  • 一文帶你搞懂Spring響應式編程

    一文帶你搞懂Spring響應式編程

    相信響應式編程經常會在各種地方被提到。本篇就為大家從函數(shù)式編程一直到Spring?WeFlux做一次簡單的講解,并給出一些示例,希望大家可以更好的理解響應式編程
    2022-07-07
  • MyBatis動態(tài)SQL特性詳解

    MyBatis動態(tài)SQL特性詳解

    動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關于Mybatis動態(tài)SQL特性的相關資料,文字通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心的方法

    SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心的方法

    本文主要介紹了SpringBoot項目改為SpringCloud項目使用nacos作為注冊中心,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • IDEA如何自動生成serialVersionUID的設置

    IDEA如何自動生成serialVersionUID的設置

    這篇文章主要介紹了IDEA如何自動生成 serialVersionUID 的設置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java讀取配置文件(properties)的時候,unicode碼轉utf-8方式

    java讀取配置文件(properties)的時候,unicode碼轉utf-8方式

    這篇文章主要介紹了java讀取配置文件(properties)的時候,unicode碼轉utf-8方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • springboot跨域問題解決方案

    springboot跨域問題解決方案

    這篇文章主要介紹了springboot跨域問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01

最新評論

云浮市| 泰顺县| 凤凰县| 富川| 太仆寺旗| 扬州市| 汶上县| 磐安县| 威海市| 新巴尔虎右旗| 南岸区| 武冈市| 诏安县| 浑源县| 宁陕县| 新乡县| 延寿县| 大荔县| 平塘县| 沂源县| 阿拉善右旗| 海宁市| 韩城市| 阿克| 宜良县| 田林县| 扶沟县| 台前县| 右玉县| 陵水| 揭阳市| 湘西| 颍上县| 布拖县| 龙井市| 万州区| 乌什县| 扬中市| 尉氏县| 新巴尔虎左旗| 荆门市|