Потокобезопасность при переборе ArrayList с использованием foreach
У меня естьArrayList
который создается и заполняется в фоновом потоке (я использую его для храненияCursor
данные). В то же время к нему можно получить доступ в главном потоке и выполнить итерацию с помощью foreach. Таким образом, это может привести к исключению.
Мой вопрос: как лучше сделать это поле класса потокобезопасным, не копируя его каждый раз и не используя флаги?
class SomeClass {
private final Context mContext;
private List<String> mList = null;
SomeClass(Context context) {
mContext = context;
}
public void populateList() {
new Thread(new Runnable() {
@Override
public void run() {
mList = new ArrayList<>();
Cursor cursor = mContext.getContentResolver().query(
DataProvider.CONTENT_URI, null, null, null, null);
try {
while (cursor.moveToNext()) {
mList.add(cursor.getString(cursor.getColumnIndex(DataProvider.NAME)));
}
} catch (Exception e) {
Log.e("Error", e.getMessage(), e);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}).start();
}
public boolean searchList(String query) { // Invoked on the main thread
if (mList != null) {
for (String name : mList) {
if (name.equals(query) {
return true;
}
}
}
return false;
}
}