2017-10-20 8 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-2が待っていて、FooをロックするのをThread-2が待っているところで、Thread-1が待っています。

Threadに同期しているとき、それは内部的にwait()を使用して厳密に言えば、現在の実装では、リリースロックを行います。しかし、それがユーザーコードに関連のない内部機構です)