java多线程嵌套_【Java并发性和多线程】嵌套管程锁死

本文介绍了Java多线程中的一种特殊现象——嵌套管程锁死,通过示例代码详细解析了其产生原因。线程在持有多个锁的情况下调用wait()方法,导致其他线程无法按预期获取锁,从而形成死锁状态。这种问题与经典的死锁不同,线程并非都在等待对方释放锁,而是线程间的等待顺序和锁的释放顺序不匹配,造成相互等待的状态。
摘要由CSDN通过智能技术生成

嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景:

线程1获得A对象的锁。

线程1获得对象B的锁(同时持有对象A的锁)。

线程1决定等待另一个线程的信号再继续。

线程1调用B.wait(),从而释放了B对象上的锁,但仍然持有对象A的锁。

线程2需要同时持有对象A和对象B的锁,才能向线程1发信号。

线程2无法获得对象A上的锁,因为对象A上的锁当前正被线程1持有。

线程2一直被阻塞,等待线程1释放对象A上的锁。

线程1一直阻塞,等待线程2的信号,因此,不会释放对象A上的锁,

而线程2需要对象A上的锁才能给线程1发信号……

你可以能会说,这是个空想的场景,好吧,让我们来看看下面这个比较挫的Lock实现:

//lock implementation with nested monitor lockout problem

public class Lock{

protected MonitorObject monitorObject = new MonitorObject();

protected boolean isLocked = false;

public void lock() throws InterruptedException{

synchronized(this){

while(isLocked){

synchronized(this.monitorObject){

this.monitorObject.wait();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值