外观
跨进程调用为什么容易死锁 怎样避免?
标准回答
典型情况是进程 A 持锁调用 B,B 又回调 A,而回调需要同一把锁或另一条形成环路的依赖。Binder 还存在嵌套调用和重入,不能因为只有一个 Binder 线程就忽略状态被重入修改。我会避免持业务锁发起外部 Binder 调用或回调,锁内只读取或更新最小状态,锁外执行远程操作,必要时使用快照和版本校验保证一致性。定位时要同时取各进程线程栈,画出锁持有和等待关系。
延伸追问
改用 oneway 可以改变等待方式,但不能消除所有锁、队列和状态一致性问题。
内容来源
- Android Framework 知识手册 · 原条目
4-6