Является ли match(Uri) класса UriMatcher реентерабельным?

Во всех виденных мной примерах создания ContentProvider использовались метод UriMatcher#match(Uri) в insert, query, update и delete для простой обработки всех шаблонов URI, на которые отвечает поставщик контента (например: http://developer.android.com/resources/samples/NotePad/src/com)./example/android/notepad/NotePadProvider.html ). Мне это казалось нормальным до сегодняшнего дня, когда я заметил в документации API ContentProvider, что insert, query, update и delete "могут [все] вызываться из нескольких потоков". Кроме того, документация UriMatcher ничего не говорит о безопасности потоков или о том, является ли match реентерабельным.

Нужно ли мне беспокоиться о синхронизации вызовов match в общем static экземпляре UriMatcher, который используется в моих реализациях insert, query, update и delete?


person Daniel Trebbien    schedule 16.10.2010    source источник


Ответы (1)


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

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

person Daniel Trebbien    schedule 17.10.2010