我对Deadlock的行为感到困惑。
如果我在Deadlock类的构造函数中首先编写pandas.set_option
然后a.foo(b)
,那么为什么不会发生死锁?
t.start()
答案 0 :(得分:5)
如果我在
a.foo(b)
类的构造函数中首先编写t.start()
和然后Deadlock
,则不会发生死锁但为什么呢?
这是因为在t.start()
的调用完成后才会调用a.foo(b)
,因为对a.foo(b)
的调用不是异步。
答案 1 :(得分:1)
要产生死锁,您必须有两个进程(a
和b
)和两个锁(x
和y
)。他们必须按照以下顺序获取锁:
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; 之后很快开始,因此会导致两个线程之间的死锁尝试访问对方锁定对方。