Потокобезопасность при переборе 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;
    }
}

Ответы на вопрос(4)

Ваш ответ на вопрос