Threadsicherheit beim Durchlaufen einer ArrayList mit foreach

Ich habe einArrayList, das instanziiert und im Hintergrund-Thread aufgefüllt wird (ich verwende es, um das @ zu speicheCursor Daten). Gleichzeitig kann auf den Haupt-Thread zugegriffen und mit foreach durchlaufen werden. Dies kann offensichtlich dazu führen, dass eine Ausnahme ausgelöst wird.

Meine Frage ist, wie man dieses Klassenfeld am besten threadsicher macht, ohne es jedes Mal zu kopieren oder Flags zu verwenden?

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;
    }
}

Antworten auf die Frage(8)

Ihre Antwort auf die Frage