外观
死锁、竞态与线程安全怎样处理?
标准回答
竞态是结果依赖不可控的并发时序;死锁是线程互相等待对方持有的资源而无法前进。减少共享可变状态,是最直接的降低复杂度方式。
关键机制
- 锁要尽量短,不在持锁时做不可控 IO、远程 Binder 或调用外部回调;这些操作可能阻塞或重入。
- 需要多把锁时约定统一获取顺序;使用快照、消息队列或单线程状态机,也能减少锁交叉。
- 定位时看所有相关线程:谁在等什么、谁持有资源、持有者又在等待谁。
通俗例子
A 持有设备锁并同步调用服务;服务回调又试图获取设备锁。即使每一段代码单看“都有锁保护”,组合后仍可能卡死。
易混淆点
线程安全不等于全局加锁;过粗的锁可能把可并行任务串行化,并把低优先级慢任务带到主线程等待链上。
参考资料
内容来源
- Android 技术札记 · 原条目
locks