线程活跃性


  • 死锁:

** 每个线程都拥有其他线程需要的资源,同时又等待其他线程已经拥有的资源,并且每个线程在获得全部需要的资源之前不会释放已经拥有的资源。

如果在持有锁的情况下调用某个外部方法,并且这个外部方法不是 开放调用 (调用方法不需要持有锁),那么就需要警惕死锁。

  • 饥饿:

** 一个线程因为处理时间全部被其他线程抢走而得不到处理器运行时间,这种状态就是饥饿。高优先级线程吞噬低优先级线程的处理时间引起的。

  • 活锁:

** 两个线程同时争取资源,然后又同时放弃资源,最后两个线程虽然没有停止运行,但是却无法执行下去。

  • 总结

  • 一旦系统进入死锁状态,将无法恢复,只能重新启动系统。产生死锁的4个条件:

  • 互斥条件:一个资源每次只能被一个线程调用。

  • 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:线程已获得的资源,在未使用之前,不能强行剥夺。
  • 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
  • 预防死锁,只需破坏上面4条之一:

    • 线程在执行任务的过程中,最好进行开放调用。
    • 各个线程最好用固定的顺序来获取资源。
    • 让持有资源的时间有限。
  • 饥饿状态取决于操作系统,尽量不要修改线程的优先级。

  • 活锁需要在遇到冲突重试时引入一定的随机性。


原文链接:https://www.cnblogs.com/meteor12138/p/9513102.html