类UriMatcher的匹配(Uri)是否可以重入?

时间:2010-10-16 23:38:55

标签: android thread-safety reentrancy android-contentprovider

我看过如何制作ContentProvider的示例都使用了insertqueryupdate中的UriMatcher#match(Uri)方法,以及delete方法可以轻松处理内容提供​​者响应的所有URI模式(例如:http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html)。这对我来说似乎没问题直到今天,当我在ContentProvider API文档中注意到insertqueryupdatedelete“可以[全部]从多个线程调用“。此外,UriMatcher文档没有说明线程安全性或match是否可重入。

我是否需要担心在match static的实施中使用的UriMatcher insertquery实例上同步对update的调用},delete和{{1}}?

1 个答案:

答案 0 :(得分:6)

通过the source of UriMatcher查看,似乎多个线程可以同时调用match方法,因为match的实现只访问每个线程的变量{ {1}}(参数),共享uri以及String的元素(通过ArrayList#get(int),这是线程安全的)。

ArrayList<UriMatcher> 是线程安全的,因为它在结构上修改了addURI。它与ArrayList读取的ArrayList相同,因此在其他线程可能正在调用match时无法调用addURI