Реализация параллельного LinkedHashMap

Я пытаюсь создать параллельный LinkedHashMap для многопоточной архитектуры.

Если я использую Collections#synchronizedMap(), Я должен был бы использовать синхронизируемые блоки для повторения. Эта реализация привела бы к последовательному добавлению элементов.

Если я использую ConcurrentSkipListMap есть ли любой способ реализовать a Comparator сохранить последовательно, как сохранено в Связанном списке или очереди.

Я хотел бы использовать Java, встроил вместо сторонних пакетов.

Править:

В этом параллельном LinkedHashMap, если ключи являются именем, я хочу поместить ключи в последовательности их прибытия. т.е. новое значение было бы добавлено или к в запуске или к конце, но последовательно.

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

Я понимаю это при помощи Collections#synchronizedMap(), синхронизируемый блок для повторения должен был бы быть реализован, но будет карта быть модифицируемой (записи могли быть добавлены/удалены), в то время как это выполняется с помощью итераций.

12
задан skaffman 4 March 2015 в 07:21
поделиться

3 ответа

Если вы используете synchronizedMap, вам не нужно выполнять внешнюю синхронизацию, за исключением итераций. Если вам нужно сохранить порядок карты, вы должны использовать SortedMap. Вы можете использовать ConcurrentSkipListMap, который является потокобезопасным, или другой SortedMap в сочетании с synchronizedSortedMap.

3
ответ дан 2 December 2019 в 23:07
поделиться

Используйте Collections # synchronizedMap () .

По моему мнению, если я использую Collections.synchronizedMap (), мне придется использовать синхронизированные блоки для получения / установки.

Это неправда.Вам нужно только синхронизировать итерацию в любом из представлений (набор ключей, значения, набор записей). Также см. Вышеупомянутую документацию по API.

1
ответ дан 2 December 2019 в 23:07
поделиться

A LinkedHashMap имеет двусвязный список, проходящий через хеш-таблицу. FIFO изменяет ссылки только при записи (вставке или удалении). Это делает реализацию версии довольно простой.

  1. Напишите LHM с разрешенным только порядком вставки.
  2. Переключитесь на ConcurrentHashMap в качестве хеш-таблицы.
  3. Защитите #put () / #putIfAbsent () / #remove () блокировкой.
  4. Сделайте "следующее" поле нестабильным.

На итерации блокировка не требуется, так как вы можете безопасно следовать за полем «следующее». Чтения могут быть свободными от блокировок, просто делегируя CHM на #get () .

2
ответ дан 2 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: