✅ 4. 线程卡死(死锁或假死)怎么优化?
🧠 首先区分:
死锁(Deadlock):多个线程互相等待资源,永远无法继续执行
假死(Livelock)/卡死:线程陷入无限循环、资源争用,表现为 CPU 占用低或无响应
死锁(Deadlock)
是什么?
多个线程相互“等着对方释放资源”,结果谁也不放手,大家都卡在那里了。
举个例子:
线程A占着资源1,想拿资源2;线程B占着资源2,想拿资源1。两个人互相等对方放资源,结果谁都不松手,永远卡住。
表现:
程序不动了,所有相关线程都被堵住了,CPU 占用可能不高,因为它们都在等。
假死(Livelock)/卡死
是什么?
线程没卡死在等待,而是一直在忙着做“无用功”,比如反复尝试获取资源但总失败,或者陷入死循环。
举个例子:
两个线程不断检测资源是否可用,一直切换状态,但从不真正获取到资源。CPU 占用很高,但程序没有实质性进展。
表现:
CPU 占用高,但程序没有正确执行任务,像是在“原地打转”。
死锁发生需要四个条件同时满足:
互斥条件(资源不能共享)
占有且等待(线程持有资源时,还申请其他资源)
不可剥夺(资源只能主动释放,不能强制夺取)
循环等待(线程间形成资源环)
只要破坏其中一个条件,死锁就不会发生。
优化方案
资源申请顺序固定
多个资源按固定顺序申请,避免循环等待。
例如,线程都先申请资源1,再申请资源2,绝不反过来。
超时重试机制
给资源申请加超时限制,超时后释放已经占有的资源,避免死锁僵持。
避免持有资源时再申请新资源
尽量设计让线程一次性申请到所有资源,或者释放掉已有资源后再申请其他资源。
检测死锁
定期检测是否存在死锁,如果发现,采取回滚、重启或其他处理方式。
使用锁机制时避免嵌套锁
减少嵌套锁的使用,降低死锁风险。
2. 假死(Livelock)优化
主要思路是:避免线程一直无效执行,增加合理等待
优化方案
引入随机等待或退避机制
当竞争资源失败时,不要马上重试,随机等待一段时间,减少资源争用。
减少竞争资源的粒度
尽量减少锁的粒度,让线程能更快释放锁,提高并发效率。
避免频繁状态切换
线程不要频繁切换状态或不停地重试,应设计合理的重试次数或时间间隔。
使用更高效的锁机制
例如,使用自旋锁、读写锁或无锁算法,根据场景选择合适的锁策略。
设计合理的业务逻辑
避免无限循环的代码逻辑,增加跳出条件或中断机制。
1072



被折叠的 条评论
为什么被折叠?



