2016-04-08 2 views
1
  1. Это под многопоточность
  2. Я прочитал темы о HashMap и не могут найти соответствующие вопросы/ответы

Код:Как объяснить повторяющиеся записи в Java Hashmap?

private Map<String, String> eventsForThisCategory; 
    ... 
    Map<String, String> getEventsForThisCategory() { 
     if (eventsForThisCategory == null) { 
      Collection<INotificationEventsObj> notificationEvents = notificationEventsIndex.getCategoryNotificationEvents(getCategoryId()); 
      eventsForThisCategory = new HashMap<String, String>(); 
      for(INotificationEventsObj notificationEvent : notificationEvents) { 
       eventsForThisCategory.put(notificationEvent.getNotificationEventID(), notificationEvent.getNotificationEventName()); 
      } 
      logger.debug("eventsForThisCategory is {}", eventsForThisCategory); 
     } 
     return eventsForThisCategory; 
    } 

Выход:

app_debug.9.log.gz: 07 Apr 2016 13: 47: 06,661 DEBUG [WirePushNotificationSyncHandler :: WirePushNot ification.Worker-1] - eventsForThisCategory является {FX_WIRE_DATA = Основные экономические данные, ALL_FX_WIRE = Все, ALL_FX_WIRE = Все, FX_WIRE_HEADLINES = Критические новости}

Как это возможно?

+0

Возможный дубликат [Что происходит, когда дублирующий ключ помещается в HashMap?] (Http://stackoverflow.com/questions/1669885/what-happens-when-a-duplicate-key-is-put-into -a-hashmap) –

+0

Ну, это невозможно. Не для 'HashMap ' как минимум. Какой параллелизм имеет ваш код? Есть ли пробелы, которые будут отличаться между двумя клавишами ALL_FX_WIRE? – Kayaman

+0

@ Kayaman Многопоточность. Нет пробелов, которые отличали бы 2 клавиши. Как вы можете видеть, он распечатывает карту, и я не считаю, что она делает автоматическую подгонку для String – Volodia

ответ

1

Я совершенно уверен, что ваша карта не будет иметь два одинаковых ключей одновременно. То, что вы видите, является эффектом изменения карты во время итерации ее (в toString()). Когда будет записано второе «ALL_FX_WIRE», первое не будет присутствовать на карте.

Вы уже знаете, что HashMap не является потоковым. Плюс eventsForThisCategory может быть изменен другим потоком, пока работает eventsForThisCategory.toString(). Поэтому этого нужно ожидать.

Убедитесь eventsForThisCategory не модифицируется несколькими потоками одновременно (или переключиться на ConcurrentHashMap), и убедитесь, что она не изменяется во время toString() работает (вызывается при создании отладочную).

+0

Ах, я совсем забыл, что 'toString' также является итерацией по карте. Спасибо за ответ, – Volodia

0

HashMap не является резьбойСайты в многопоточном режиме. вы можете попробовать использовать Collections.synchronizedMap() обернуть вас HashMap экземпляр или использовать ConcurrentHashMap может быть лучше

+0

Не тот ответ, который я ожидал. Вы не объяснили, как это происходит. – Volodia