当前位置: 首页 > 知识库问答 >
问题:

Android:ContentResolver实例是线程安全的吗?

龚弘业
2023-03-14

我们都知道ContentResolver查询不应该在UI线程上执行,但是,令人惊讶的是,我在官方文档中找不到有关ContentResolver类的线程安全性的信息。

我知道如何编写线程安全的ContentProvider,并且我知道SQLite默认情况下是线程安全的(它实现了内部锁定机制)。

但是,从多个线程使用ContentResolver的单个实例安全吗(例如,在同一对象上并行调用insert()query()

共有2个答案

任云瀚
2023-03-14

它取决于你的代码,如果你在安全的单一实例中实现你的内容解析程序,如果你没有添加锁,它可能是安全的,它将不会是线程安全的。

暨成双
2023-03-14

深入一点源代码,我们最终找到了由android为应用程序创建的ContentResolver实例,该应用程序是驻留在ContentImpl内的应用程序ContentResolver类的实例。

从下面的代码段和ContextResolver的源代码可以看出,没有状态变量。

 private static final class ApplicationContentResolver extends ContentResolver {
        private final ActivityThread mMainThread;
        private final UserHandle mUser;
        public ApplicationContentResolver(
                Context context, ActivityThread mainThread, UserHandle user) {
            super(context);
            mMainThread = Preconditions.checkNotNull(mainThread);
            mUser = Preconditions.checkNotNull(user);
        }
    ....

这必然意味着其线程是安全的。

 类似资料:
  • 这会产生冲突吗?例如,当2个线程试图同时执行它们的任务时?

  • 问题内容: 我想知道一个类的每个实例是否在该类中都有自己的方法副本? 可以说,我有以下课程: 因此,如果两个不同的用户创建了like这样的实例: 是否知道每个用户在其线程中都有的方法的副本?如果是,则实例变量是线程安全的,只要只有实例方法对其进行操作,对吗? 我问这个问题是因为我经常读到实例变量不是线程安全的。而且,当每个用户通过调用运算符获取实例时,我不明白为什么会这样? 问题答案: 每个对象都

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn

  • 静态编程语言单例(更具体地说,对象声明)在结构上是线程安全的吗?如果不是,用静态编程语言编写线程安全单例的最佳实践是什么? 我想是的,但我在文件中找不到任何明确的声明。