![]() |
1
29
在Java中,每个
将导致死锁的一系列事件是:
要更详细地显示事件顺序,请执行以下操作:
现在,两个线程都无法执行。线程2和线程3都在等待释放锁。但是,如果线程没有进展,两个锁都无法释放。但是,如果不释放锁,两个线程都无法取得进展。 因此:僵局! 死锁通常取决于发生的特定事件序列,这会使调试变得困难,因为它们很难重现。 |
![]() |
2
2
|
![]() |
3
2
死锁是一种典型的锁反转。一根线锁住阿尔方斯。然后(或同时在多核系统上)另一个线程锁定gaston。这一部分要求线程的调度恰好在正确的点进行交错。 然后,每个线程(以任何顺序或同时)尝试获取另一个线程已经持有的锁,因此每个线程进入睡眠状态。在另一方释放其锁之前,两者都不会唤醒,但在唤醒(或终止)之前,两者都不会释放其锁。 |
![]() |
4
2
对于给定的对象实例 ,一次只能运行一个线程 同步(o) 块其他每一个尝试的线程都会哀号,直到运行该块的线程(具有 同步锁 在其上)退出该块(放弃锁定)。 在您的例子中,当Alphonse开始在线程1中弯曲,从而进入同步块时,就会发生死锁。然后,线程1被系统调出,因此线程2可以启动,并使加斯顿弓形。但加斯顿还不能退后,因为它正在阿尔方斯同步,线程1已经有了锁。因此,它将等待线程1离开该块。然后,系统将线程1换回,这将尝试使阿尔方斯弓回。但它不能这样做,因为线程2在Gaston上有同步锁。现在两条线都卡住了,等待另一条线完成弯曲,然后才能向后弯曲。。。 |
![]() |
Administrator · c#-等待完成2个线程中的1个 7 年前 |
![]() |
Magnar Myrtveit · 发送电子邮件的脚本中出现死锁 7 年前 |
![]() |
BlackBrain · MySQL死锁,带有引发触发器的插入 8 年前 |
|
Patt · ExecutorService和ForkJoinPool 9 年前 |