2017-10-20 159 views
-3

我調試此代碼,我不明白爲什麼我會死鎖。當你執行這段代碼時,它看起來像是連接方法中的主線程鎖,而另一個線程正在等待獲取鎖。Java - Thread.join()不釋放鎖

public class Foo { 

private final Thread thread; 

public Foo() { 
    thread = new Thread(new Bar(), "F"); 
    thread.start(); 
} 

public void run() { 
    synchronized (this) { 
     thread.interrupt(); 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Foo run method"); 
    } 
} 

private final class Bar implements Runnable { 

    @Override 
    public void run() { 
     synchronized (Foo.this) { 
      System.out.println("Bar run method"); 
     } 
    } 

} 

public static void main(String[] args) throws InterruptedException { 
    final Foo foo = new Foo(); 
    foo.run(); 
} 

} 

感謝您的幫助!

+2

我不明白它是什麼,你不」不明白。 'Thread.join()'等待目標線程完成。 Javadoc沒有任何關於釋放鎖的信息。你做到了。 – EJP

+0

請仔細閱讀線程是如何工作的。 –

回答

5

這是因爲Thread.join()不會釋放任何鎖。你已經設計了一個完美的工作陷入僵局,其中Thread-1等待Thread-2死已經鎖定Foo,並Thread-2正在等待鎖定Foo

(從技術上說當前實現不釋放鎖,因爲它在內部使用wait()同時Thread同步。但是,這不是涉及到用戶代碼的內部機制)