您并未真正消除 死锁 ,而是(由于某些内部JVM原因)更改了线程的计时,以使其中一个线程
bowBack()在 其他调用 之前
进入
bow()。只需输入
bow:
sleep(1000),您的僵局就会再次出现。
请注意,只有在线程处于 幸运 时机时,死锁并不 总是 发生。在这种情况下,当两个线程都进入并且它们中的任何一个都调用之前,就会发生死锁
__
bow``bowBack
…并且 “某些内部JVM原因” 可以如下:
在您的情况下,实际上有三个线程:一个执行 main , t1 和 t2 。放置 打印
隐藏死锁的原因可能是线程调度程序决定
main仍有工作要做,即刷新io缓冲区,因此让 main 在开始 t1之后
和开始t2之前继续。如果你是一个双核CPU,只
main和
t1会运行,但
t2会等待,因为
t1 将在 t2 之前完成 __可以开始…所以不会发生死锁。 但这并不意味着如果再次运行该程序,就不会发生死锁。
If you want to play, create a
queueand push tokens (thread names) in that
queue, then
joinyour threads in main. After they finish, print the queue
content and you can observe the timing of the threads.



