在Java中,每个函数都Object
提供了synchronize
在其上锁定或锁定线程的功能。同步方法时,该方法将其对象实例用作锁。在你的示例中,方法bow
和bowBack
都属于synchronized
,并且都位于同一类中Friend
。这意味着任何执行这些方法的线程都将在Friend
实例上作为其锁进行同步。
一系列将导致死锁的事件是:
为了更详细地显示事件的顺序:
现在,你处于无法执行任何线程的位置。线程#2和线程#3都在等待释放锁。但是,如果没有Thread进展,则无法释放任何锁定。但是没有释放锁,任何线程都无法取得进展。
因此:死锁!
死锁通常取决于发生的事件的特定顺序,这可能使调试变得困难,因为它们可能难以重现。