我看过如何制作ContentProvider
的示例都使用了insert
,query
,update
中的UriMatcher#match(Uri)
方法,以及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
和{{1}}?
答案 0 :(得分:6)
通过the source of UriMatcher
查看,似乎多个线程可以同时调用match
方法,因为match
的实现只访问每个线程的变量{ {1}}(参数),共享uri
以及String
的元素(通过ArrayList#get(int)
,这是线程安全的)。
ArrayList<UriMatcher>
不是线程安全的,因为它在结构上修改了addURI
。它与ArrayList
读取的ArrayList
相同,因此在其他线程可能正在调用match
时无法调用addURI
。