死锁的产生条件

1.四个条件

死锁的定义:

多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

可重入锁

站在锁对象的角度来说 ,它认为自己已经被另外的线程给占用了,然后进行二次加锁,如果二次加锁成功之后说明这个锁是可重入锁,如果上述操作会进行阻塞等待的话说明是不可重入锁。这个情况就会导致线程无法正常进行,就会产生死锁

死锁的三种情况:

1.一个线程一把锁,连续加锁两次,如果锁是不可重入锁,就会死锁。

2.两个

.线程两把锁,分别获取对方的锁

t1 和 t2 各自先针对 锁A 和锁B 加锁,再次尝试获取对方的锁,但是锁都是被双方各自获得,都要相互等待对方释放锁,因此进入循环等待,这样就会产生死锁

3.多个线程多把锁

大家都很熟知的我们操作系统书上的经典案例,哲学家就餐问题,五个哲学家一起吃一份面条,桌子上有五根筷子,要想吃面条得有两根筷子,大家都想吃面条,但是筷子只有五根。谁先吃谁后吃,谁说了也不算。极端情况下大家都想吃面条,都拿起了桌子上的筷子,一人拿了一根,但是没有人有两根筷子,大家就陷入了僵局,就产生了死锁

上述这三种情况都会产生死锁,我们也讲了死锁产生的四个必要条件,突破口就是循环等待

办法就是给锁编号,然后指定一个固定顺序(比如从小到大)来加锁,任意线程加多把锁的时候,都让线程遵守上述规则·,此时循环等待自然破除。就像上述的哲学家就餐的问题,我们把筷子进行一个编号,让大家先拿编号小的筷子,顺序从小到大,大家依次拿起筷子,但是现在筷子有了顺序了,一号筷子旁的两个哲学家就会竞争这根筷子,只能被一个人拿到,另一个人就会阻塞等待,这时候五号筷子就会剩下,拿四号筷子的哲学家就可以拿五号和四号来吃面条,吃完后把两根筷子都放下,拿三号筷子的哲学家也就可以吃面了,以此类推,循环等待问题就迎刃而解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值