Разве для одновременной хэш-карты не требуются синхронизированные методы получения / установки? - PullRequest
4 голосов
/ 15 января 2011

Если бы я использовал одновременную хэш-карту и у меня были методы, которые устанавливали и получали значения, так как я использую параллельную хэш-карту, мне нужно было бы синхронизировать метод получения и установки? Это избыточно? Один дизайн лучше?

Кроме того, является ли параллельная хеш-карта без синхронизации быстрее, чем хеш-карта с синхронизированными получателями и установщиками? Это для высокопроизводительной системы

Спасибо

Ответы [ 2 ]

7 голосов
/ 16 января 2011
  1. java.util.concurrent.ConcurrentHashMap является потокобезопасным
  2. Это быстрее, чем использование synchronized(object)
  3. Вам все равно нужно быть осторожным, чтобы не создавать "логическое" условие гонкипо коду, подобному этому

    if (map.get(key) != null) {
        map.put(key, new SomethingStrictlyUnique());
    }
    
  4. Как правило, замена синхронизированных коллекций на параллельные коллекции может предложить существенные масштабируемость улучшения с небольшими рисками.

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

1 голос
/ 15 ноября 2013

1) Если у вас есть методы getter и setter, которые выполняют только одну операцию (например, метод get будет возвращать только значение карты для данного ключа) или какую-либо потокобезопасную операцию, то вам не нужен явный синхронизированный блокдля этих методов получения и установки.

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

Примечание: ConcurrentHashMap слабо согласован, что приемлемо в большинстве случаев.

...