синхронизировать доступ к HashMap извне - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть личное HashMap, и я использую Collections.synchronizedMap() на нем.API говорит, что он не является «поточно-ориентированным», когда карта повторяется.Я обычно использую Map.entrySet() для итерации карт, поэтому я думаю, что карте нужен блок ручной синхронизации, как показывает API.Но извне я не могу синхронизироваться с ссылкой на карту, потому что она является закрытой .... Мне интересно, должен ли я предоставить получатель для фактической ссылки на карту (возможно, это не очень хороший дизайн ООП) или вернуть глубокую копиюкарты?(может быть, это медленно).Я не знаю, как лучше поступить с такой ситуацией.Кто-нибудь может дать какую-то идею или сказать мне, какой самый типичный способ справиться с этой ситуацией?

1 Ответ

3 голосов
/ 12 сентября 2011

Я бы настоятельно рекомендовал использовать ConcurrentHashMap , если вам действительно необходим одновременный доступ к HashMap.Это часть пакета util.concurrent с Java 5+.Он работает намного лучше в многопоточной среде, чем синхронизированные оболочки.

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

  Map m = Collections.synchronizedMap(new HashMap());
      ...
  Set s = m.keySet();  // Needn't be in synchronized block
      ...
  synchronized (m) {  // Synchronizing on m, not s!
      Iterator i = s.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...