Является ли матч (Uri) класса UriMatcher повторно входящим? - PullRequest
5 голосов
/ 17 октября 2010

Примеры, которые я видел, как сделать 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

1 Ответ

6 голосов
/ 17 октября 2010

При просмотре источника UriMatcher выясняется, что несколько потоков могут одновременно вызывать метод match, поскольку реализация match обращается только к каждому потокупеременная uri (параметр), общие String s и элементы ArrayList<UriMatcher> (через ArrayList#get(int), который является потокобезопасным).

addURI не поточно-ориентированный, поскольку структурно изменяет ArrayList.Это тот же ArrayList, из которого match читает, поэтому addURI не может быть вызван, в то время как другие потоки, возможно, вызывают match.

...