Я пытаюсь создать параллельный LinkedHashMap для многопоточной архитектуры.
Если я использую Collections#synchronizedMap()
, Я должен был бы использовать синхронизируемые блоки для повторения. Эта реализация привела бы к последовательному добавлению элементов.
Если я использую ConcurrentSkipListMap
есть ли любой способ реализовать a Comparator
сохранить последовательно, как сохранено в Связанном списке или очереди.
Я хотел бы использовать Java, встроил вместо сторонних пакетов.
Править:
В этом параллельном LinkedHashMap
, если ключи являются именем, я хочу поместить ключи в последовательности их прибытия. т.е. новое значение было бы добавлено или к в запуске или к конце, но последовательно.
При итерации, LinkedHashMap
мог быть добавлен с новыми записями или удален. но повторение должно быть последовательностью, в которой были добавлены записи.
Я понимаю это при помощи Collections#synchronizedMap()
, синхронизируемый блок для повторения должен был бы быть реализован, но будет карта быть модифицируемой (записи могли быть добавлены/удалены), в то время как это выполняется с помощью итераций.
Если вы используете synchronizedMap, вам не нужно выполнять внешнюю синхронизацию, за исключением итераций. Если вам нужно сохранить порядок карты, вы должны использовать SortedMap. Вы можете использовать ConcurrentSkipListMap, который является потокобезопасным, или другой SortedMap в сочетании с synchronizedSortedMap.
Используйте Collections # synchronizedMap ()
.
По моему мнению, если я использую Collections.synchronizedMap (), мне придется использовать синхронизированные блоки для получения / установки.
Это неправда.Вам нужно только синхронизировать итерацию в любом из представлений (набор ключей, значения, набор записей). Также см. Вышеупомянутую документацию по API.
A LinkedHashMap
имеет двусвязный список, проходящий через хеш-таблицу. FIFO изменяет ссылки только при записи (вставке или удалении). Это делает реализацию версии довольно простой.
#put ()
/ #putIfAbsent ()
/ #remove ()
блокировкой. На итерации блокировка не требуется, так как вы можете безопасно следовать за полем «следующее». Чтения могут быть свободными от блокировок, просто делегируя CHM на #get ()
.