并发编程2:并发的问题:死锁——两段不同的逻辑都在等待对方的锁释放才能继续执行

本文介绍了死锁的概念,即多个线程互相等待资源导致的僵局,并通过一个例子展示了死锁的发生。同时,提供了两种解决死锁的方法:改变加锁顺序以避免嵌套锁,以及为锁设置超时释放机制,利用ReentrantLock的tryLock功能来防止无限等待。
摘要由CSDN通过智能技术生成

1、什么是死锁

死锁:即多个线程因竞争而造成一种互相等待的现象。

简单一点说:

一个资源每次只能被一个进程使用,而当正在占用这个资源的进程又需要去使用其它资源时正好处于阻塞状态,导致使用中的资源无法释放,请求的资源又处于无限等待中。

如果所有代码都是我们自己开发的,不太会出现这样的情况,至少在不是太复杂的情景下应该不会刻意去设计一个死锁的代码,但如果调用了其它外部的api或一些共享的资源时,就不可避免的出现一些死锁的情况。

如:一个线程T1持有锁R1并且申请获得锁R2,而另一个线程T2持有锁R2并且申请获得锁R1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。

 

但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁R1并且申请获得锁R2,而线程T2持有锁R2并且申请获得锁R3,而线程T3持有锁R3并且申请获得锁R1,这样导致了一个锁依赖的环路:T1依赖T2的锁R2,T2依赖T3的锁R3,而T3依赖T1的锁R1。从而导致了死锁。

2、写一个死锁:

package pub.ryan.concurrency.stage1;

public class DeadLockDemo {
    public static void main(String[] args) {
        Event event = new Event();
        new Thread(()->{
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pub.ryan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值