在开发java中,我们会遇到死锁,死锁就是指多个进程在运行过程中因争夺资源而造成的一种僵局,而如果大家不及时解决,肯定会影响工作效率,那java开发怎么防止死锁?下面来我们就来给大家讲解一下。
下面是一个多线程死锁的例子
输出
thread1 get lock1
thread2 get lock2
两个线程相互得到锁1,锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1,两者各不相互,这样形成死锁。
避免和解决死锁问题可以参考以下方法:
1、按顺序加锁
上个例子线程间加锁的顺序各不一致,导致死锁,如果每个线程都按同一个的加锁顺序这样就不会出现死锁。
2、获取锁时限
每个获取锁的时候加上个时限,如果超过某个时间就放弃获取锁之类的。
3、死锁检测
按线程间获取锁的关系检测线程间是否发生死锁,如果发生死锁就执行一定的策略,如终断线程或回滚操作等。
产生死锁要什么条件?
死锁产生的4个必要条件:
1、互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2、不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
3、请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4、循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
死锁场景,其实还有一些更令人头疼的死锁,
产生死锁是需要这几个条件的,如果条件不成立,也不会产生死锁,不过大家遇到死锁不要着急,可以按照以上的方法去解决,最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: