UriMatcher 类的 match(Uri) 是可重入的吗?
我看到的关于如何制作 ContentProvider
的示例 都使用了 < insert
、query
、update
和 中的 code>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
是否可重入。
我是否需要担心在 insert 实现中使用的
、UriMatcher
的共享 static
实例上同步对 match
的调用查询
、更新
和删除
?
The examples that I have seen of how to make a ContentProvider
have all used the UriMatcher#match(Uri)
method within the insert
, query
, update
, and delete
methods to easily handle all of the URI patterns that the content provider responds to (e.g.: http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html). This seemed okay to me until today, when I noticed on the ContentProvider
API documentation that insert
, query
, update
, and delete
"can [all] be called from multiple threads". Additionally, the UriMatcher
documentation says nothing about thread-safety or whether match
is reentrant.
Do I need to worry about synchronizing calls to match
on a shared, static
instance of UriMatcher
that is used within my implementations of insert
, query
, update
, and delete
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
浏览
UriMatcher
的来源,看来多个线程可以同时调用match
方法,因为match
的实现仅访问每线程变量uri
(参数)、共享String
和ArrayList< 的元素;UriMatcher>
(通过ArrayList#get(int)
,这是线程安全的)。addURI
是非线程安全的,因为它在结构上修改了ArrayList
。match
读取的内容与ArrayList
相同,因此当其他线程可能调用match
时,无法调用addURI
。Looking through the source of
UriMatcher
, it appears that multiple threads can call thematch
method simultaneously because the implementation ofmatch
only accesses the per-thread variableuri
(the parameter), sharedString
s, and elements of anArrayList<UriMatcher>
(viaArrayList#get(int)
, which is thread-safe).addURI
is not thread-safe because it structurally modifies anArrayList
. It is the sameArrayList
thatmatch
reads from, soaddURI
cannot be called while other threads are possibly callingmatch
.