Как правильно синхронизировать список, доступ к которому осуществляется несколькими потоками? - PullRequest
1 голос
/ 02 февраля 2020

У меня есть список, который обновляется в одном потоке каждые 20 мс и читается в другом потоке каждые 16 мс. Я слышал, что в таком случае лучше использовать синхронизированный список, а не copyonwritearraylist, правильно?

Должен ли я изначально инициализировать этот список как

List<Object> list = Collections.synchronizedList(new ArrayList<Object>());

?

Или я должен сделать его обычным списком, а затем каждый раз, когда я хочу читать из него, использовать метод например,

public List<Object> synList(ArrayList<Object> list) {
    return Collections.synchronizedList(list);
}

Извините, если это тривиально, я действительно не уверен. Большое вам спасибо

1 Ответ

2 голосов
/ 02 февраля 2020

У меня есть список, который обновляется в одном потоке каждые 20 мс и читается в другом потоке каждые 16 мс. Я слышал, что в таком случае, как правило, лучше использовать синхронизированный список, а не copyonwritearraylist, правильно?

Да.

CopyOnWriteArrayList только действительно полезно когда у вас способ больше операций чтения, чем записи, поэтому стоимость копирования списка компенсируется более быстрым чтением.

У вас примерно одинаковое количество операций записи и чтения, поэтому это не t применяются.

Должен ли я изначально инициализировать этот список как List<Object> list = Collections.synchronizedList(new ArrayList<Object>());? или я должен сделать его регулярным списком, а затем каждый раз, когда я хочу читать из него, используйте метод ...

Второй бесполезен.

Синхронизированный список только полезно, если все обращения к нижележащему списку также синхронизированы на одной и той же вещи; по сути, единственный безопасный способ его использования - это сразу же завернуть список при создании, то есть первым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...