溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java模擬死鎖發生之演繹哲學家進餐問題的示例分析

發布時間:2021-08-17 09:20:59 來源:億速云 閱讀:147 作者:小新 欄目:編程語言

這篇文章主要介紹了Java模擬死鎖發生之演繹哲學家進餐問題的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一 點睛

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

二 實戰

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 解決方法

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

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模擬死鎖發生之演繹哲學家進餐問題的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女