互不相让:当两个(或更多)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。
死锁的影响在不同系统中是不一样的,这取决于系统对死锁的处理能力 数据库中:检测并放弃事务 JVM中:无法自动处理
Jstack ThreadMxBean
避免策略 检测与恢复策略
虽然线程并没有阻塞,也始终在运行(所以叫做“活”锁,线程是“活”的),但是程序却得不到进展,因为线程始终重复做同样的事 死锁和活锁的结果是一样的
原因:重试机制不变,消息队列始终重试,吃饭始终谦让 以太网的指数退避算法 加入随机因素
原因:消息如果处理失败,就放在队列开头重试 解决:放到队列的尾部,添加重试限制次数
产生原因: 当线程需要某些资源(例如CPU),但是却始终得不到 线程优先级过低 某线程持有锁但不释放