简单的说一说java线程中的死锁和嵌套管程锁死问题?

本文详细解析了死锁与嵌套管程锁死这两种常见并发问题的区别。死锁发生在两个线程相互等待对方释放锁,而嵌套管程锁死则是一个线程在等待另一个线程的信号的同时持有某个锁,导致另一线程无法发送信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    死锁指的是两个线程都在等待另一个线程释放锁,比如:线程T1获取了锁L1然后在等待获取锁L2,线程T2获取了锁L2然后在等待获取锁L1,这样就产生了死锁。嵌套管程锁死指的是一个线程获取锁后在另一个锁上调用了wait进入等待另一个线程发送唤醒信号,比如L:线程T1获取了锁L1然后在锁L2上调用了wait方法,线程T2需要同时获取锁L1和L2才能向T1发送信号,这样就产生了嵌套管程锁死。

 

参考资料:

嵌套管程锁死

嵌套管程锁死 VS 死锁

嵌套管程锁死与死锁很像:都是线程最后被一直阻塞着互相等待。

但是两者又不完全相同。在死锁中我们已经对死锁有了个大概的解释,死锁通常是因为两个线程获取锁的顺序不一致造成的,线程1锁住A,等待获取B,线程2已经获取了B,再等待获取A。如死锁避免中所说的,死锁可以通过总是以相同的顺序获取锁来避免。
但是发生嵌套管程锁死时锁获取的顺序是一致的。线程1获得A和B,然后释放B,等待线程2的信号。线程2需要同时获得A和B,才能向线程1发送信号。所以,一个线程在等待唤醒,另一个线程在等待想要的锁被释放。

不同点归纳如下:

死锁中,二个线程都在等待对方释放锁。

嵌套管程锁死中,线程1持有锁A,同时等待从线程2发来的信号,线程2需要锁A来发信号给线程1。

转载于:https://my.oschina.net/u/914290/blog/802812

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值