死锁

显然,死锁发生在多线程(或者多进程)的情况下,并且已经占有了某个资源,并且试图获取对方的资源。(如果没有占有资源,只是试图去获取资源,那么就不是死锁了,而是线程同步了!)

  产生死锁的条件:  

    1)互斥条件: 某个资源在某一时刻最多只能被一个线程占有

    2)请求和保持条件: 进程保持(占有)了至少一个资源,并试图请求另外的资源

    3)不可抢占条件: 进程已获得的资源在未使用完之前,不可被剥夺

    4)循环等待条件: 多个线程由于都希望获取另外一个线程的资源,而形成了循环链。

  用自己的话说:有两个以上线程,每个线程都占有至少一个资源,被占有的资源在同一时刻最多只能由一个线程占有,并且在线程未使用完之前,不能强行获取该资源,每个现场试图获取另外一个线程的资源,构成了一个循环等待链。

    预防死锁:通过破坏死锁产生的条件,(当然不能破坏互斥条件,否则线程没法同步了)

      1)破坏请求保持条件: 也就是线程已经占有了不可抢占资源,并尝试获取新的不可抢占资源

          进程一次性获取所有的不可抢占资源,获取失败,就让进程等待。或者释放掉自己获取的不可占资源后,再去获取新的资源

      2)破坏不可抢占资源    进程获取资源失败后,释放掉已占有的资源

      3)破坏循环等待条件   给资源进行排序,进程按序号递增的顺序请求资源

  死锁的检测:

    在java中,先通过jps命令,得到虚拟机中运行的进程

          然后通过 jstack + jps得到的vmid   来查看是否产生了死锁

    

posted @ 2020-07-19 09:45  你眼里的星辰  阅读(87)  评论(0)    收藏  举报