JDK поставляется с реализациями CopyOnWrite*
для Set
и List
, но ни один для Map
, и я часто жаловался на этот факт. Я знаю, что есть другие коллекции, которые есть у них, но было бы неплохо, если бы один был отправлен в качестве стандарта. Это похоже на очевидное упущение, и мне интересно, есть ли для этого веская причина. Кто-нибудь знает, почему это было не учтено?
Почему Java не поставляется с CopyOnWriteMap?
Ответ 1
Я думаю, это зависит от вашего варианта использования, но зачем вам нужно CopyOnWriteMap, если у вас уже есть ConcurrentHashMap?
Для простой таблицы поиска со многими читателями и только с одним или несколькими обновлениями она подходит.
По сравнению с копией на коллекцию записи:
Прочитайте concurrency:
Равным образом копировать на коллекцию записи. Несколько читателей могут извлекать элементы с карты одновременно с блокировкой.
Записать concurrency:
Лучше concurrency, чем копия на коллекциях записи, которые в основном сериализуют обновления (по одному обновлению за раз). Используя параллельную хэш-карту, у вас есть хорошая возможность делать несколько обновлений одновременно. Если ваши хеш-ключи распределены равномерно.
Если вы сделаете хотите получить копию на карте записи, вы всегда можете инициализировать ConcurrentHashMap с уровнем concurrency 1.
Ответ 2
Простейшей реализацией набора обычно будет использование базовой карты. У них даже есть метод Collections.newSetFromMap() [возможно только от версии 1.6].
То, что они должны были сделать, было иметь экземпляр CopyOnWriteMap и CopyOnWriteSet, эквивалентный Collections.newSetFromMap(новый CopyOnWriteMap()).
Но, как вы видите, CopyOnWriteArraySet на самом деле поддерживается массивом, а не картой. И не будет Collections.newSetFromMap(ConcurrentHashMap()) быть приемлемым для вашей usecase?