我知道 Android 的 ContentProvider 以从多进程/多线程多次写入而不会抛出锁定异常而闻名。在多线程环境中,它可能已经使用读写锁同步了方法。但是将创建多个对象的多进程呢?任何人都可以让我在 ContenProvider 内部工作。
最佳答案
A ContentProvider是一个 list 声明的组件,它由操作系统实例化并绑定(bind)到主进程(除非属性 process
被不同地指定)。因此,在该应用程序进程的生命周期内,只会创建已声明的 ContentProvider
的单个实例。其他希望与之交互的进程必须通过 ContentResolver这反过来只是与创建的单个提供者通信。
请注意,当从另一个进程使用提供者时,它通过 IPC 进行通信(特别是通过 Binders),这意味着在 IPC 调用期间,将在 BinderThread
中调用提供者的方法。有一个 Binder 线程池,因此可以与多个应用程序进行一些并发通信,这意味着应该进行适当的同步。
总而言之,content provider 对于多进程和多线程交互是安全的,因为:
- 他们是单例。
- 开发人员通过适当同步共享状态来保证多线程安全。
- 多进程安全由 ContentProvider 保证。
- ContentProvider 的定义具有适合 IPC 交互的返回类型。 (它们是 Parcelable,如 AssetFileDescriptor,或者它们是 SQLiteCursor,由使用 ashmem 分配的共享内存支持)。
关于android - Android 内容提供程序中来自多个进程的多次写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57029749/