2017-10-20 46 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同步。但是,这不是涉及到用户代码的内部机制)