JavaEE 死锁

        多个线程同时被阻塞的时候,它们中的一个或多个全部在等待某一个资源被释放,但是因为线程被阻塞,程序不可能正常终止。死锁在多线程中是一个常见的BUG,通俗说,就是在给线程尝试加锁的时候,发现这个线程上一次加的锁没有及时释放,导致锁加不上。

产生死锁的场景

(1)一个线程一把锁(可重入锁)。线程a针对锁1连续加锁两次,如果是一个不可重入锁,就产生死锁。第一次加锁的时候,能够成功。 第二次加锁的时候,需要第一次加的锁释放,才能成功。但是如果发现第一次加的锁还没有释放。这个时候要释放掉,只能依赖第二次加锁成功,第二次加锁成功,需要第一次的锁释放,这个时候,就产生了死锁。

(2)两个线程两把锁。线程1先获取到锁a,线程2获取到锁b。线程1尝试获取锁b,线程2尝试获取锁a,这个过程,就产生了死锁。

(3)n个线程m把锁。和(2)类似,是一个更复杂的情况。典型的案例就是哲学家就餐问题。多个线程多把锁的情况下,死锁是一个概率性问题,但是绝对不能忽视。

产生死锁的必要条件

(1)互斥使用:线程1拿到锁a,其他线程无法获取锁a;

(2)不可抢占:线程1拿到锁a,其他线程只能阻塞等待,等到线程1主动释放锁 ,而不是抢走锁;

(3)请求和保持:当线程1拿到锁a后,就会一直持有这个获取锁的状态,直到主动释放;

(4)循环等待:线程1循环等待线程2,线程2又尝试等待线程1。和编写代码相关。

如何避免死锁

        最容易做到的,就是打破循环等待。办法是:针对多把锁的时候,将锁进行编号。约定获取多把锁的时候,明确获取锁是有顺序的。这样,就能破解循环等待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值