• 技术文章 >Java >java教程

    Java中死锁的概念及解决办法

    零下一度零下一度2017-07-20 13:41:31原创1526

    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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 死锁 基础
    上一篇:Lambda表达式是什么?有什么用呢? 下一篇:java编译器特性
    千万级数据并发解决方案

    相关文章推荐

    • 带你搞懂Java结构化数据处理开源库SPL• 一文搞懂Java接口• 一起来理解Java中的泛型• 整理分享Java语言表达式的五个谜题• 详细整理java枚举的使用总结
    1/1

    PHP中文网