线程饥饿
# 线程饥饿
# 发生原因
- 高优先级的线程占用了大部分的CPU时间,低优先级线程发生饥饿
- 线程被永久堵塞在一个等待进入同步块的状态
- 线程在等待一个本身也处于永久等待完成的对象
当为每个线程设置优先级时,优先级越高,就能获得越高的CPU使用时间,一旦中途一直有高优先级的线程进入排队,那么最低优先级的线程将永远无法使用资源!
其次,Java的synchronized
不保证线程进入语句块的顺序,如果有一个线程一直阻塞在synchronized
语句块,将永远无法进入synchronized
。
同样的,notify
也无法保证唤醒的顺序,因此会导致某一个wait
有可能一直陷入长期沉睡,久而久之永久饥饿!
# 解决方法
建议不要过于依赖synchronized
,而应该使用自己编写的lock进行状态切换,这样可以最大程度控制锁。