死锁的原因及解决方法,死锁怎么解决?

TheDisguiser 2020-05-24 13:30:24 java常见问答 9199

如果一个程序员写代码不规范,有时候在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常见问答知识的话,就请关注我们的网站了解吧。

推荐阅读:

死锁产生的场景都有哪些?死锁产生的条件是什么?

如何避免死锁你知道吗?死锁产生的原因是什么?

如何避免死锁?死锁避免的几种方式