簡體   English   中英

了解我的死鎖Java示例

[英]Understanding my Deadlock Example of Java

我試圖在java中實現死鎖。線程t1和t2以相同的順序鎖定s1和s2導致死鎖情況。但是,如果我注釋掉Line1和Line2調用線程類的sleep方法,則不會發生死鎖。我運行此程序超過15次,但刪除第1行和第2行不會導致死鎖。

所以我的查詢是,第1行和第2行(調用Thread.sleep)是死鎖所必需的。如果是,那么我還沒有理解死鎖。如果不是,它會導致其他JVM死鎖嗎?

//Thread DeadLock

class Threadlock 
{
 private final static  String s1="java";
 private final  static String s2="deadlock";
 public static void main(String[] args)
 {  
  Thread t1= new Thread()
  {
     public void run()
     {
      synchronized(s1)
      {
       try { Thread.sleep(100);} 
       catch (Exception e) {}  //Line 1
       synchronized(s2)
       {}
      }
     }
  };

  Thread t2= new Thread()
  {
     public void run()
     {
      synchronized(s2)
      {
        try { Thread.sleep(100);} catch (Exception e) {}  //Line 2
        synchronized(s1)
        {}
      }
     }
  };

  t2.start();
  t1.start();
  }
 }

如果你取消睡眠,你的方法什么都不做。 因此它們非常快,以至於兩個線程同時進入其第一個同步塊的概率非常低。 但它仍然可能發生。

關鍵是:您對底層實現沒有太多控制權。 含義:雖然您創建了兩個線程並按順序啟動它們; 實際上JVM / OS很可能會發生...從t1開始; 跑吧 然后開始t2。

為了增加你陷入死鎖的機會; 讓你的方法做事至少幾秒鍾!

換句話說:“運行到死鎖”是​​一個函數,它取決於方法的實際運行時間底層實現的細節。

並行程序本質上是不確定的。 實際上,當您執行錯誤的程序時,可能會或可能不會觀察到潛在的死鎖。 您提供的代碼在使用和不調用Thread.sleep時都是格式錯誤的。 在您的情況下,睡眠似乎使死鎖更加明顯,但無論您是否等待一段時間,它都在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM