国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java模擬死鎖發(fā)生之演繹哲學(xué)家進(jìn)餐問(wèn)題的示例分

發(fā)布時(shí)間:2021-09-04 11:55 來(lái)源:億速云 閱讀:0 作者:小新 欄目: 開(kāi)發(fā)技術(shù)

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

一 點(diǎn)睛

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

二 實(shí)戰

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("守護線(xiàn)程:程序仍在運行中...");
    }
  }
}

2 運行

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

三 預防死鎖

1 解決方法

如果規定線(xiàn)程A和B都必須先拿刀,再拿叉,就不會(huì )發(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("守護線(xiàn)程:程序仍在運行中...");
    }
  }
}

3 運行

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

国产SUV精品一区二区883| 亚洲AV日韩AV鸥美在线观看| 中文字幕在线日亚州9| 人妻系列影片无码专区| 色狠狠色狠狠综合天天| 亚洲午夜国产精品无码|