2017-02-26 81 views
3

我試圖在java中自己實現死鎖。線程t1和t2都以相同的順序鎖定s1和s2,導致死鎖情況。但是,如果我註釋掉Line1和Line2調用睡眠方法的線程類,不會發生死鎖。我運行該程序超過15次,但刪除行1和行2不會導致死鎖。瞭解我的死鎖Java示例

所以我的查詢是,行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(); 
    } 
} 
+1

當某些線程同時需要相同的鎖時,可能會發生死鎖。就你的情況而言,如答案所述,同步塊無效 - 他們需要接近「沒有時間」。閱讀http://tutorials.jenkov.com/java-concurrency/deadlock.html,它可以幫助你更好地理解機制。 –

+0

如果您對第1行和第2行進行註釋,請在其他程序的幫助下持續運行您的程序,我相信您會通過eod瞭解死鎖。 –

+0

一個想法:你希望別人花時間幫助你;所以你請花1分鐘時間來正確地格式化/全部輸入。但仍然upvoted ... – GhostCat

回答

6

如果您刪除睡眠,您的方法不會做任何事情。所以它們非常快,以致兩個線程同時進入其第一個同步塊的概率非常低。但它仍然可能發生。

0

併發程序本質上是不確定的。在實踐中,當執行錯誤的程序時可能會或可能不會觀察到潛在的死鎖。您提交的代碼在調用Thread.sleep時不合格。在你的情況下,睡覺似乎讓僵局更加明顯,但無論你是否等待一段時間,睡眠都在那裏。

1

重點是:您對底層實現沒有太多控制。含義:儘管你創建了兩個線程並按順序啓動它們;它可能發生在現實中的JVM/OS ... start t1;運行它;然後再開始t2。

爲了增加您遇到死鎖的機會;保持你的方法至少做幾秒鐘!

換句話說:「遇到死鎖」是​​一種函數,它取決於您的方法的實際運行時間底層實現的詳細信息。

+2

Upps。正確。如果第一個人進入關鍵部分並停留在那裏,那麼這不是死鎖;另一個不到那裏。那麼,其他一些死鎖。無論如何;我刪除了那部分。感謝您的輸入! – GhostCat