为什么没有发生死锁?

时间:2018-04-04 16:47:50

标签: java multithreading deadlock

我对Deadlock的行为感到困惑。 如果我在Deadlock类的构造函数中首先编写pandas.set_option然后a.foo(b),那么为什么不会发生死锁?

t.start()

3 个答案:

答案 0 :(得分:5)

  

如果我在a.foo(b)类的构造函数中首先编写 t.start()然后 Deadlock,则不会发生死锁但为什么呢?

这是因为在t.start()的调用完成后才会调用a.foo(b),因为对a.foo(b)的调用不是异步

答案 1 :(得分:1)

要产生死锁,您必须有两个进程(ab)和两个锁(xy)。他们必须按照以下顺序获取锁:

  • a获得x;
  • b获得y;
  • a正在等待获取y;
  • b正在等待获取x

在您的代码中,您有synchronized个方法。他们正在获取与方法运行的实例相关联的锁。也就是说,他们从不试图获取彼此的锁。这就是他们被序列化的原因。

要产生死锁,您需要依赖其他锁而不是synchronized方法的隐式锁。

答案 2 :(得分:0)

当你运行这个程序时,创建的第一个线程是'主线程' ,所以如果你在t.start()之前调用a.foo(b),程序将由主线程序列执行。所以在主线程下直到执行堆栈a.foo() - > b.foo()结束t.start()将不被执行,即

  

以简单的方式,直到第4行的代码完成代码   第5行不会被执行

。因此,在 }elseif($rrInt == 1){ $vid['thumbs'][] = array('name'=>$item, 'link'=>$fullPath); echo "<a href='$fullPath'><i for='$rrInt'>$item</i></a><br />"; 死锁的情况下是不可能的。但是在a.foo(b);t.start;的情况下,异步执行将在&#39;线程t.start()&#39; 之后很快开始,因此会导致两个线程之间的死锁尝试访问对方锁定对方。