1、线程活性故障
由资源稀缺性或者程序自身的问题和缺陷导致线程一直处于非Runnable状态,或者线程虽然处于Runnable状态但是其要执行的任务却一直无法进展的故障现象
2、死锁
1、产生条件(必要非充分)
- 资源互斥
- 资源不可抢夺
- 占用并等待资源
- 循环等待资源
2、破坏任一条件即可避免死锁
一般从“占用并等待资源”和“循环等待资源”两方面破坏条件
-
粗锁法:使用粗粒度的锁待敌代替多个锁(破坏 占用并等待资源)
缺点:降低了并发性并可能导致资源浪费 -
锁排序法:相关线程使用全局统一的顺序申请锁(破坏 循环等待资源)
-
使用
ReentrantLock.tryLock(long,TimeUnit)
申请锁,指定了一个超时时间,在时间内锁申请成功则返回true,超时则返回false
3、死锁的恢复
- 如果代码中使用的是内部锁或显式锁而锁的申请是通过
Lock.lock()
调用实现的,则这些锁导致的死锁故障不可恢复,只能重启Java虚拟机 - 如果使用显式锁且通过
Lock.lockInterruptibly()
调用实现,则这些锁导致的死锁故障理论上可恢复
3、锁死
1、信号丢失锁死
由于没有相应的通知线程来唤醒等待线程而使等待线程一直处于等待状态的一种活性故障
2、嵌套监视器锁死
嵌套锁导致等待线程永远无法被唤醒的一种活性故障
4、线程饥饿
线程一直无法获得其所需的资源而导致其任务一直无法进展的一种活性故障
1、线程池
1、三个形态
- 当前线程池大小
在当前线程池大小超过核心线程池大小时,超过的部分工作者线程空闲时间达到keepAliveTime之后就会被清理 - 核心线程池大小:人为设置的一个不大于最大线程池大小的工作者线程数量上限
- 最大线程池大小
2、线程池的死锁
同一个线程池只能执行相互独立的任务避免死锁