死锁

产生死锁的必要条件(2,3,4任意不成立)

  1. 互斥条件:进程访问的是临界资源,那个资源一次只能被一个进程所使用。
  2. 不剥夺条件:一个资源仅能被占有它的进程所释放,而不能被其他进程剥夺。
  3. 部分分配:(请求和保持条件)一个进程在请求新的资源的同时,保持对某些资源的占有。
  4. 环路等待条件:存在一个进程的环路链,链中每一个进程占用有着某个或某些资源,又在等待链中的另一个进程占有的资源。

预防死锁

  1. 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
  2. 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
  3. 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
  4. 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

避免死锁

预先计算资源分配的安全性:银行家算法

  • 系统中每种资源的总量
  • 未分配给进程的每种资源的总量
  • 进程对资源的需求
  • 当前分配给进程的资源

解除死锁

  • 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;

  • 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止

    代价是指优先级、运行代价、进程的重要性和价值等。

死锁检测

  1. 为每个进程和每个资源指定一个唯一的号码;
  2. 建立资源分配表和进程等待表。

Jstack命令

java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出Java堆栈信息。 用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。