синхронизированный против блокировки против синхронизированной карты - PullRequest
1 голос
/ 01 мая 2011


Мне нужно синхронизировать мой доступ к хэш-карте. Вот мои варианты

  1. Я знаю, что могу использовать ключевое слово Synchronize. это один из вариантов. Могу ли я использовать саму карту?
  2. В настоящее время у меня есть метод get, который, если объект не существует, создает его и помещает в карту. Я могу синхронизировать метод.
  3. Я могу использовать блок синхронизации
  4. Я могу использовать
    Карта m = Collections.synchronizedMap (новый HashMap (...)); в моем коде.

Я, как правило, делаю 4, потому что это звучит проще всего. Какие-либо предложения?

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Я бы посоветовал вам не синхронизировать методы и не блокировать саму карту.Я обычно предпочитаю использовать отдельный объект блокировки, который только используется для блокировки и только известный в классе, который владеет картой.

Вы можете потенциально используйте synchronizedMap, но это зависит от того, что вы хотите с ним сделать.Если вы только когда-нибудь получите и поставите значения, тогда это нормально.Если вам когда-либо понадобится перебрать по карте, вам нужно заблокировать другие потоки от изменения карты во время перебора.

Другой вариант - использовать ConcurrentHashMap.Смотрите документы для семантики.Это, вероятно, самый простой подход, если он ведет себя так, как вам нужно.

2 голосов
/ 01 мая 2011

Вы можете использовать ConcurrentHashMap.putIfAbsent (), который может делать то, что вы хотите без синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...