Потокобезопасно ли выполнять итерацию объекта HashMap одновременно? - PullRequest
3 голосов
/ 24 февраля 2012

Если несколько потоков одновременно повторяют объект HashMap, без его изменения , есть ли шанс для условий гонки?

Ответы [ 4 ]

5 голосов
/ 24 февраля 2012

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

3 голосов
/ 24 февраля 2012

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

1 голос
/ 24 февраля 2012

Все будет хорошо. Но если какой-либо из потоков добавляет или удаляет элемент, это вызовет исключение в любых других потоках, которые просто перебирают HashMap (фактически, любая коллекция)

0 голосов
/ 24 февраля 2012

Если вы собираетесь многократно повторять карту, вы можете найти ее немного быстрее для перебора копии массива.

private final HashMap<String, String> properties = new HashMap<String, String>();
private volatile Map.Entry<String, String>[] propertyEntries = null;

private void updatePropertyEntries() {
    propertyEntries = properties.entrySet().toArray(new Map.Entry[properties.size()]);
}

{
    // no objects created
    for (Map.Entry<String, String> entry : propertyEntries) {

    }
}

Кстати: один поток может изменять / заменять propertyEntries при повторении во многих потоках с этим шаблоном.

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