线程从产生线程继承锁

时间:2014-07-17 16:48:00

标签: java multithreading join wait synchronized

当衍生线程试图获取锁定时,以下代码没有阻止。

产生的线程是否从产生线程继承锁?

以下是代码:

public class A {

    public void methodA() {
        public class SpawnedThread extends Thread {
            public void run() {
                synchronized(this) {
                ...
            }
       };

       SpawnedThread spawnedThread= new SpawnedThread ();
       synchronized(spawnedThread) {
            spawnedThread.start();
            spawnedThread.join();
      };
      ...
   }
}

2 个答案:

答案 0 :(得分:3)

线程不会从其他线程继承锁,这里还会发生其他事情。

在您的示例中,运行methodA的线程必须先获取spawnedThread上的锁,然后才能进入synchronized块。

然后当spawnedThread运行时,它必须获取自身的锁,以便在run方法中输入synchronized块。

因此方法A线程具有锁定,而spawnedThread正在尝试获取相同的锁定。但它不会死锁,因为Thread.join执行等待放弃锁定的位置,请参阅api documentation for Thread.join

  

此实现使用this.wait调用on.isAlive的循环。当一个线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。

没有超时值的Thread.join版本会锁定它正在加入的线程,放弃它并进入休眠状态。它会在下列情况发生之前醒来:

1)正在连接的线程完成(发送唤醒等待线程的通知)

2)连接线程被中断(意味着某些东西会调用中断,这在本例中不会发生)

3)连接线程自行唤醒(“虚假唤醒”,这是罕见的,是竞争条件的结果)

我不清楚您如何更改锁定以获得死锁,如您在评论中所述,如果您希望得到答案,请将该版本的代码添加到您的问题中。

答案 1 :(得分:1)

  

产生的线程是否从产生线程继承锁?

不,你也没有在产卵线程中锁定产生的线程继承。

您可以尝试使用Lock执行此操作,但如果您尝试,则会抛出IllegalMonitorStateException。

  

“synchronized(spawnedThread){spawnedThread.start();};”在实例化spawnedThread之后。

一旦退出此块,spwaned线程就可以获得锁定。如果要查看死锁,请在synchronized块内移动join()。