外观
Binder 通信中出现死锁的常见原因是什么?如何避免?
标准回答
同步跨进程调用如果又遇到互相等待的锁,就可能形成双方都无法继续的死锁。
- 不要持有内部锁时调用不受控的远程接口。
- 尽量保持一致锁顺序,缩小临界区。
- 跨进程回调可能重入,接口状态机要能承受这种执行顺序。
通俗例子
A 持有锁调用 B,B 处理时又回调 A 并等待同一把锁,A 等 B、B 等 A。尽量避免持锁进行不可控的远程调用。
深入解释
**死锁怎样形成:**进程 A 持有锁时同步调用 B,B 处理过程中又回调 A 并等待同一资源,双方可能互相等着无法继续。嵌套调用和跨线程等待会让这种关系更隐蔽。
**怎样减少风险:**缩小持锁范围,尽量别在持锁时执行外部同步调用;必须跨进程协调时,明确回调与完成通知的顺序,不能只靠增加 Binder 线程数解决。
易混淆点
仅把方法改成 oneway 不能保证消除所有锁和资源等待问题。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
7.5.1