Skip to content
阅读进度

Binder 通信中出现死锁的常见原因是什么?如何避免? ​

返回 Framework 与系统服务 目录

标准回答 ​

同步跨进程调用如果又遇到互相等待的锁,就可能形成双方都无法继续的死锁。

  • 不要持有内部锁时调用不受控的远程接口。
  • 尽量保持一致锁顺序,缩小临界区。
  • 跨进程回调可能重入,接口状态机要能承受这种执行顺序。

通俗例子 ​

A 持有锁调用 B,B 处理时又回调 A 并等待同一把锁,A 等 B、B 等 A。尽量避免持锁进行不可控的远程调用。

深入解释 ​

**死锁怎样形成:**进程 A 持有锁时同步调用 B,B 处理过程中又回调 A 并等待同一资源,双方可能互相等着无法继续。嵌套调用和跨线程等待会让这种关系更隐蔽。

**怎样减少风险:**缩小持锁范围,尽量别在持锁时执行外部同步调用;必须跨进程协调时,明确回调与完成通知的顺序,不能只靠增加 Binder 线程数解决。

易混淆点 ​

仅把方法改成 oneway 不能保证消除所有锁和资源等待问题。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。