4

,我已經看到,如何使一個ContentProvider示例全都使用insertqueryupdate,和delete方法內的UriMatcher#match(Uri)方法容易地處理所有的URI模式的內容提供者響應(例如:http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NotePadProvider.html) 。直到今天,我看到ContentProvider API文檔中提到insert,query,updatedelete「可以全部從多個線程中調用」,這對我來說似乎沒有問題。此外,UriMatcher文檔沒有提到線程安全性或match是否可重入。UriMatcher類的折返(Uri)是否匹配?

我需要擔心對UriMatcher共享,static實例,它是我的insertqueryupdatedelete實現內使用同步調用match

回答

5

通過the source of UriMatcher尋找,看來多個線程可以同時調用match方法由於match執行只訪問每線程變量uri(參數),共享String s和一個ArrayList<UriMatcher>的元件(經由ArrayList#get(int),這是線程安全的)。

addURI不是線程安全,因爲它在結構上修改了ArrayList。它與match讀取的ArrayList相同,所以addURI不能被調用,而其他線程可能調用match