Самый эффективный способ сделать структуру данных поточно-ориентированной (Java) - PullRequest
6 голосов
/ 19 февраля 2012

У меня есть общая структура данных Map, которая должна быть поточно-ориентированной.Является ли синхронизация наиболее эффективным способом чтения или добавления на карту?

Спасибо!

Редактировать: структура данных является не обновляемым кешем, т.е. после заполнения она не обновляеткэш.Так что сначала много записей с некоторыми операциями чтения, а в основном чтение

Ответы [ 4 ]

6 голосов
/ 19 февраля 2012

«Наиболее эффективный», конечно, относителен и зависит от вашей конкретной ситуации.Но рассмотрим что-то вроде ConcurrentHashMap , если вы ожидаете, что одновременно с картой будет работать много потоков;он потокобезопасен, но все же допускает параллельный доступ, в отличие от Hashtable или Collections.synchronizedMap().

3 голосов
/ 19 февраля 2012

Это зависит от того, как вы используете его в приложении.

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

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

1 голос
/ 19 февраля 2012

Для вашего конкретного случая использования (не обновляемый кэш) копия на карте записи превзойдет синхронизированную карту и ConcurrentHashMap.

См. https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap в качестве одного примера (я считаю, apacheтакже имеется копия при реализации карты записи).

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

синхронизированные методы или коллекции, безусловно, будут работать. Это не самый эффективный подход, но он прост в реализации, и вы не заметите накладных расходов, если не получите доступ к структуре миллионы раз в секунду.

Лучшей идеей может быть использование ConcurrentHashMap - он был спроектирован для параллелизма с самого начала и должен работать лучше в условиях высокой параллелизма.

...