Есть ли какие-либо недостатки с ConcurrentHashMap? - PullRequest
5 голосов
/ 17 октября 2010

Мне нужен HashMap, доступный из нескольких потоков.

Существует два простых варианта: использование обычного HashMap и синхронизация на нем или использование ConcurrentHashMap.

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

Карта также будет очень маленькой (до десяти записей), если это делаетразница.

По сравнению с обычным HashMap, насколько дороже операции чтения и записи (я полагаю, что они есть)?Или ConcurrentHashMap всегда лучше, когда возможен даже умеренный уровень одновременного доступа, независимо от отношения чтения / обновления и размера?

Ответы [ 4 ]

6 голосов
/ 17 октября 2010

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

Стоимость приобретения и освобождения неконтролируемого Java mutex (примитивная блокировка) минимальна. Поэтому, если вы считаете, что вероятность раздора очень мала, тогда, вероятно, лучшим выбором будет простое HashMap.

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

* ... если у вас нет действительно хорошей интуиции.

2 голосов
/ 17 октября 2010

С точки зрения пропускной способности и производительности накладные расходы обычно незначительны.

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

2 голосов
/ 17 октября 2010

CHM платит некоторый штраф за использование операций Atomic * под прикрытием по сравнению с HashMap. Сколько? Угадай, что ... измерить это в вашем приложении ...; -)

Если вы обнаружите, что у вас действительно есть проблема с производительностью, вероятно, существует очень специализированное решение для <10 записей, которое будет дешевле, чем любое решение, собранное из <code>java.util земли, но я бы не стал переходить к этому, пока вы не узнаете у вас проблема с производительностью.

0 голосов
/ 24 января 2011

Основная проблема с CHM: он плохо масштабируется, если вы не измените вызов c-tor, но в основном он не масштабируется автоматически для доступных ядер.

3 ссылки ниже на хэш-карту без блокировки
http://www.azulsystems.com/blog/cliff-click/2007-03-26-non-blocking-hashtable
http://www.azulsystems.com/blog/cliff-click/2007-04-01-non-blocking-hashtable-part-2
http://sourceforge.net/projects/high-scale-lib/

...