Java中死锁的概念及解决办法
程序员文章站
2022-05-20 21:44:53
...
1.进程死锁及解决办法
一、要点提示
(1) 掌握死锁的概念和产生死锁的根本原因。
(2) 理解产生死锁的必要条件--以下四个条件同时具备:互斥条件、不可抢占条件、占有且申请条件、循环等待条件。
(3) 记住解决死锁的一般方法,掌握死锁的预防和死锁的避免二者的基本思想。
(4) 掌握死锁的预防策略中资源有序分配策略。
(5) 理解进程安全序列的概念,理解死锁与安全序列的关系。
(6) 了解银行家算法。
(7) 了解资源分配图。
(8) 了解死锁的检测及恢复的思想。
2.关于死锁,我个人的理解:
经过一段时间的学习,我理解的死锁概念就是,比如有两段进程,每一个进程中都被两把锁(锁1、锁2),锁着。不同的是,在两段进程中,锁的应用位置不同。从而产生了,一个进程的完整启动,内部需要一把锁,而这把锁又恰巧在另一个进程那里。另一个进程想要完整启动(或执行)内部所需要的那把锁又在另一个程序里。这样互相牵绊着,都处于准备状态却无法向下执行。造成了死锁状态。我根据理解画了示意图:
3.关于死锁的一段简单代码:
public class Test15 {public static void main(String[] args) throws InterruptedException {new Thread(new DeadLockThread(true)).start();//Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。new Thread(new DeadLockThread(false)).start(); } }class DeadLockThread implements Runnable {static Object o1 = new Object();static Object o2 = new Object();private boolean flag; DeadLockThread(boolean flag) {this.flag = flag; }public void run() {if (flag == true) {while (true) {synchronized (o1) { System.out.println("这是锁o1");synchronized (o2) { System.out.println("这是锁o2"); }
打印结果:
4.补充:
关于死锁,我查找了一些资料,感觉这里的问题蛮复杂。现阶段仅了解这些简单原理。也能大致了解到死锁发生必须具备一定的四个条件。
1)互斥条件:
指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:
指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:
指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:
指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
附:
1)调用sleep()方法,并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行
2)调用wait()方法,当前运行的线程就会转入等待状态,等待别的线程再次调用这个对象的notify()或者notifyAll()方法唤醒它,或者到了指定的等待时间,线程自动醒来。
如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。
3)在实际开发中,死锁一般隐藏的较深,不容易被发现,一旦死锁现象发生,就必然会导致程序的瘫痪。因此必须避免它的发生。
以上就是Java中死锁的概念及解决办法的详细内容,更多请关注其它相关文章!
下一篇: php正则抓取整个域名下的图片
推荐阅读
-
Java中异常的概念及异常的形式存在
-
eclipse中java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
-
Java中死锁的原理实战分析
-
OY!原来是JAVA的BUG呀~~~在SwingWorker中嵌套调用SwingWorker的死锁问题解决方法。
-
java程序中没有错,但是项目上面显示一个红叉的解决办法
-
java程序中没有错,但是项目上面显示一个红叉的解决办法
-
web报表工具FineReport使用中遇到的常见报错及解决办法(二) finereportweb报表java报表总结
-
web报表工具FineReport使用中遇到的常见报错及解决办法(一) finereport报表工具java报表web报表
-
idea中springboot用外部tomcat启动报错java.lang.NoClassDefFoundError: javax/el/ELManager的解决办法
-
Java中关于单例模式线程安全问题的解决办法