Подтвердить что ты не робот

Почему Java не поставляется с CopyOnWriteMap?

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

4b9b3361

Ответ 1

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

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

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

Прочитайте concurrency:

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

Записать concurrency:

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

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

Ответ 2

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

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

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