我所看到的有关如何制作 ContentProvider
的示例都使用了UriMatcher#match(Uri)
,insert
,query
和update
方法中的 delete
方法来轻松处理内容提供商响应的所有URI模式(例如http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html)。直到今天,这对我来说似乎还可以,当时我在ContentProvider
API文档中注意到insert
,query
,update
和delete
“可以[全部]从多个线程中调用”。此外,UriMatcher
文档未提及线程安全性或match
是否可重入。
我是否需要担心在match
,static
,UriMatcher
和insert
的实现中使用的,在query
的共享update
实例上同步对delete
的调用?
最佳答案
仔细观察the source of UriMatcher
,似乎多个线程可以同时调用match
方法,因为match
的实现仅访问每个线程变量uri
(参数),共享的String
s和ArrayList<UriMatcher>
的元素(通过 ArrayList#get(int)
,它是线程-安全的)。addURI
是而不是线程安全的,因为它在结构上修改了ArrayList
。它与ArrayList
读取的match
相同,因此在其他线程可能正在调用addURI
时无法调用match
。