如果一个程序员写代码不规范,有时候在java程序运行中就会碰到死锁,那么小伙伴们知道死锁产生的原因都有么?又该怎么解决死锁呢?快跟小编了解了解吧。
一、死锁是什么?
当两个或以上的线程同时拥有对方需要的资源,谁也不想让谁,导致大家都处理等待状态,没有外力就无法结束,这种状态就叫死锁。
二、死锁产生的原因都有哪些?
a互相竞争不可抢占资源
如A1此时打开B1,又想去打开B2,A2这时已经打开B2,又想去打开B1,但是B1和B2都是不可抢占的,所以这就产生了死锁。
b互相竞争可消耗资源
进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1接收p3的消息m3,p2接收p1的m1,发m2给p3,p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。
c加锁顺序不当
进程在运行过程中,请求和释放资源的顺序不当,同样会导致产生死锁。
三、如何解决死锁?
首先我们得知道死锁是永远无法根除的,因为只要代码存在就有可能产生死锁特别是在一些高并发的系统中,所以我们只有尽可能优化速度,来减少互相等待的机会。
1.确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生了,如下:
Thread 1: lock A lock B Thread 2: wait for A lock C(when A locked) Thread 3: wait for A wait for B wait for C
2.出现死锁异常后,简单粗暴手工将死锁解开。
3.想个法子,让线程不要这么贪婪,不要去竞争那些不可抢占的资源。如:当一个线程在申请资源时,必须要释放自己已经拥有的资源。
4.允许线程程进行抢占,方法一:如果去抢资源,被拒绝,就释放自己的资源。方法二:操作系统允许抢,只要你优先级大,可以抢到。
5.将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。
以上就是关于死锁如何产生及解决方法的所有内容了,如果对java感兴趣,想知道更多相关的java常见问答知识的话,就请关注我们的网站了解吧。
推荐阅读: