Параллелизм Java и HashMaps только для добавления - PullRequest
4 голосов
/ 19 апреля 2011

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

После того, как данные «помещены» в HashMap, эти данные никогда не изменяются. Когда-либо. Всякий раз, когда вносится изменение в состояние этой структуры данных, она фактически просто создает новое «поколение» структуры, оставляя старое нетронутым.

То есть, безопасно ли читать значение из HashMap в то время, когда другой поток записывает значение, зная, что другой поток никогда не будет записывать значение, которое вы читаете ? Есть ли какая-то простая структура хеш-таблицы, которая даст мне такую ​​гарантию?

Ответы [ 4 ]

2 голосов
/ 19 апреля 2011

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

1 голос
/ 19 апреля 2011

Я знаю, что вы заявили, что он не будет перезаписан, но стоит рассмотреть ConcurrentHashMap хотя бы потому, что вам больше не понадобится ваш код блокировки.

Эта специальная карта (начиная с Java 1.5) гарантирует, что вы никогда не получите исключение ConcurrentModificationException, поскольку она вернет вам последнюю «завершенную» запись.

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html

Это также супер-быстрый для нескольких одновременных чтений. Смотрите эту статью для получения дополнительной информации:

http://www.ibm.com/developerworks/java/library/j-jtp07233/index.html#N101CD

Другие вещи, на которые следует обратить внимание: он не допускает нулевые ключи / значения и имеет другой удобный метод, putIfAbsent.

НТН

1 голос
/ 19 апреля 2011

Проблема не в данных в хэш-карте, а в том, что вы модифицируете саму хеш-карту при вставке чего-либо; его структура. Вы не можете сделать это с несколькими потоками одновременно со стандартным HashMap.

Параллельный пакет Java предлагает потоковую хэш-карту:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html

Внутренне это будет использовать неблокирующие методы безопасности потока.

0 голосов
/ 19 апреля 2011

Вместо HashMap вы можете использовать persistentMap, тогда каждый автор должен будет заблокировать его при добавлении нового объекта и замене ссылки на карту новым, но читатели всегда могут прочитать из «текущей» версии ( возможно, не найдено значение, которое они ищут, потому что оно одновременно добавляется.

Обратите внимание, что чтение и запись ссылки на карту должны выполняться атомарно.

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