java死锁的原因及解决办法

1.什么是死锁

所谓死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。

例:如果有个线程a,按照先锁a再锁b的顺序获取得锁,在此同时又有另一个线程b,按照先锁b再锁a的顺序获取锁。

2.产生死锁的原因

1.系统资源不足;

2.进程推进顺序不合适;

3.资源分配不当;

3.死锁产生的必要条件

  1. 互斥使用:即当资源被一个线程使用(占有)时,别的线程不能使用
  2. 不可抢占:资源的请求者不能强制从资源的占有者手中获取资源,资源只能由占有者主动释放
  3. 请求和保持:资源的请求者在请求其他资源的同时保持对原有资源的占有
  4. 循环等待:即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路

4.解决死锁的办法

  1. 加锁顺序:能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生
  2. 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁
  3. 死锁检测:JConsole工具对运行的资源和性能进行监控

5.代码角度:

一种是用synchronized,一种是用Lock显式锁实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值