** 每个线程都拥有其他线程需要的资源,同时又等待其他线程已经拥有的资源,并且每个线程在获得全部需要的资源之前不会释放已经拥有的资源。
如果在持有锁的情况下调用某个外部方法,并且这个外部方法不是 开放调用 (调用方法不需要持有锁),那么就需要警惕死锁。
** 一个线程因为处理时间全部被其他线程抢走而得不到处理器运行时间,这种状态就是饥饿。高优先级线程吞噬低优先级线程的处理时间引起的。
** 两个线程同时争取资源,然后又同时放弃资源,最后两个线程虽然没有停止运行,但是却无法执行下去。
总结
一旦系统进入死锁状态,将无法恢复,只能重新启动系统。产生死锁的4个条件:
互斥条件:一个资源每次只能被一个线程调用。
预防死锁,只需破坏上面4条之一:
饥饿状态取决于操作系统,尽量不要修改线程的优先级。
原文链接:https://www.cnblogs.com/meteor12138/p/9513102.html