死锁
1、死锁的产生条件
(1)互斥条件:一个资源一次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程获得的资源,在未完全使用完之前不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系。
2、死锁的定位方法
基于命令行的 jstack(先 jps 确定进程号)或基于图形化界面的 jconsole。
3、死锁避免办法
(1)破坏请求并保持条件:采用静态分配的方式。意思是在进程执行之前就申请需要的全部资源,直至所有的资源全部获得后才开始执行,如果有一个资源不能获得,则也不给该进程分配其他的资源。
(2)破坏不可剥夺条件:指当某进程获得了部分资源,但得不到其他资源,就释放已获得的资源,但是只适用于内存和处理器资源。
(3)破坏循环等待条件:给系统的所有资源编号,规定进程所请求的资源顺序必须按照资源的编号依次进行。
活锁
两个线程互相在改变对方的结束条件,导致两个线程都无法停止,此时两个线程都未阻塞,都在运行。解决办法是让两线程有交错,别集中在一起运行或中间 sleep 一个随机数。
饥饿
一个线程由于优先级太低,始终得不到 CPU 的调度执行,也不能结束,就一直处于饥饿状态。