死锁
显然,死锁发生在多线程(或者多进程)的情况下,并且已经占有了某个资源,并且试图获取对方的资源。(如果没有占有资源,只是试图去获取资源,那么就不是死锁了,而是线程同步了!)
产生死锁的条件:
1)互斥条件: 某个资源在某一时刻最多只能被一个线程占有
2)请求和保持条件: 进程保持(占有)了至少一个资源,并试图请求另外的资源
3)不可抢占条件: 进程已获得的资源在未使用完之前,不可被剥夺
4)循环等待条件: 多个线程由于都希望获取另外一个线程的资源,而形成了循环链。
用自己的话说:有两个以上线程,每个线程都占有至少一个资源,被占有的资源在同一时刻最多只能由一个线程占有,并且在线程未使用完之前,不能强行获取该资源,每个现场试图获取另外一个线程的资源,构成了一个循环等待链。
预防死锁:通过破坏死锁产生的条件,(当然不能破坏互斥条件,否则线程没法同步了)
1)破坏请求保持条件: 也就是线程已经占有了不可抢占资源,并尝试获取新的不可抢占资源
进程一次性获取所有的不可抢占资源,获取失败,就让进程等待。或者释放掉自己获取的不可占资源后,再去获取新的资源
2)破坏不可抢占资源 进程获取资源失败后,释放掉已占有的资源
3)破坏循环等待条件 给资源进行排序,进程按序号递增的顺序请求资源
死锁的检测:
在java中,先通过jps命令,得到虚拟机中运行的进程
然后通过 jstack + jps得到的vmid 来查看是否产生了死锁
也许会有遗憾,但是不应该在失败之前
浙公网安备 33010602011771号