Почему Java не поставляется с CopyOnWriteMap? - PullRequest
33 голосов
/ 22 ноября 2010

JDK поставляется с CopyOnWrite* реализациями для Set и List, но не для Map, и я часто жаловался на этот факт. Я знаю, что есть другие реализации коллекций, в которых они есть, но было бы неплохо, если бы они поставлялись в качестве стандарта. Это кажется очевидным упущением, и мне интересно, была ли для этого веская причина. Кто-нибудь знает, почему это было опущено?

Ответы [ 2 ]

27 голосов
/ 28 ноября 2010

Полагаю, это зависит от вашего варианта использования, но зачем вам CopyOnWriteMap, если у вас уже есть ConcurrentHashMap ?

Для простой справочной таблицы с большим количеством читателей и только одним или несколькими обновлениями она подойдет.

По сравнению с копией при записи коллекции:

Чтение параллелизма:

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

Запись параллелизма:

Лучший параллелизм, чем копия коллекций записи, которые в основном сериализуют обновления (по одному обновлению за раз). Используя одновременную хэш-карту, у вас есть хороший шанс сделать несколько обновлений одновременно. Если ваши хеш-ключи распределены равномерно.

Если вы хотите хотите получить эффект копирования на карте записи, вы всегда можете инициализировать ConcurrentHashMap с уровнем параллелизма 1.

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

Самой простой реализацией набора обычно будет использование базовой карты.У них даже есть метод Collections.newSetFromMap () [возможно, только из 1.6].

То, что они должны были сделать, это иметь CopyOnWriteMap и CopyOnWriteSet, эквивалентный Collections.newSetFromMap (новый CopyOnWriteMap()).

Но, как вы можете видеть, CopyOnWriteArraySet фактически поддерживается массивом, а не картой.И не будет Collections.newSetFromMap (ConcurrentHashMap ()) приемлемым для вашего варианта использования?

...