Java死锁

死锁条件:
互斥:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求等待:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
循环等待:在发生死锁时,必然存在一个进程–资源的环形链。
死锁预防:
破坏互斥条件:加锁就是为了线程互斥,所以一般不会破坏这个条件。
破坏请求等待:线程满足所有资源需求后再进行资源分配。
破坏不可剥夺:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源。
破坏循环等待:给每个线程分配一个序号,按序分配资源。
死锁避免:
银行家算法:允许进程动态地申请资源,但系统再进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程,否则让进程等待。可用资源向量、最大需求矩阵、分配矩阵、需求矩阵。
安全状态是指系统能按某种进程推进顺序(p1,p2,…pn)为每个进程pi分配其所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺序完成。
死锁检测:
通过资源分配图,如果分配图没有环,那么系统就没有进程死锁。如果分配图有环,那么可能存在死锁。
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

Java 死锁是多线程编程中一个重要且棘手的问题,下面从定义、产生原因、解决方案等方面进行介绍。 ### 定义 死锁指两个或多个线程互相持有对方所需的资源,并同时等待对方释放资源,导致程序无法继续执行。程序会陷入“僵局”状态,无法自行解锁,通常会导致程序无响应或者卡死,无法正常处理请求。每个线程都持有一个资源并且同时等待另一个资源,形成一种僵局,没有任何一个线程能够释放其持有的资源,也无法获得它所需的资源,程序停止响应 [^2]。 ### 产生原因 主要是资源竞争,每个线程持有一个资源的同时又去等待获取其他线程持有的资源,从而形成循环等待的局面。一旦出现死锁,整个程序既不会发生任何错误,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。Java 虚拟机没有提供检测,也没有采取任何措施来处理死锁的情况 [^2][^4]。 ### 解决方案 解决死锁要根据产生死锁的条件来进行: 1. **针对资源互斥**:可以根据代码逻辑去掉互斥锁逻辑,比如涉及金额的话用 `AtomicInteger`(原子操作)、`ThreadLocal`、CAS 乐观锁 [^3]。 2. **针对请求与保持条件**:可以用 `List` 集合将 2 个资源放在一个集合中,通过 `contains` 判断,如果集合中有元素,就用一个 boolean 变量标记 `false`,直到 2 个资源释放后,变量标记 `true`,后面的线程才能使用 [^3]。 3. **针对不可剥夺条件**:通过 `this.lock.tryLock(2, TimeUnit.SECONDS)` 设置时长锁等待 [^3]。 死锁发生后,通常只能通过人工干预来解决,比如重启服务或者杀死线程。所以只能在编码时避开可能出现死锁的问题,按照死锁发生的四个条件,破坏其中的一种就能避免死锁的发生,但互斥条件无法被破坏,因为它是互斥锁的基本约束 [^5]。 ```java import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class A extends Thread { private final Lock lock = new ReentrantLock(); // 设置锁 public boolean loop = true; public static Object object1 = new Object(); public static Object object2 = new Object(); public A(boolean loop) { this.loop = loop; try { this.lock.tryLock(2, TimeUnit.SECONDS); // 设置锁等待 } catch (InterruptedException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值