Как объяснить повторяющиеся записи в Java Hashmap?
- Это под многопоточностью
- Я прочитал темы о 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 апр. 2016 г. 13:47:06,661 DEBUG [WirePushNotificationSyncHandler::WirePushNotification.Worker-1] - eventsForThisCategory: {FX_WIRE_DATA= ключевые экономические данные, ALL_FX_WIRE= все, ALL_FX_WIREIN = курс} = все, валютные курсы = все, FX_
Как это возможно?
2 ответа
Я совершенно уверен, что на вашей карте не будет двух одинаковых ключей одновременно. То, что вы видите, - это эффект изменения карты при ее повторении (в toString()
). Когда написано второе "ALL_FX_WIRE", первое больше не будет присутствовать на карте.
Вы уже знаете, что HashMap
не является потокобезопасным. плюс eventsForThisCategory
может быть изменен другим потоком, в то время как eventsForThisCategory.toString()
бежит. Так что этого следует ожидать.
Удостовериться eventsForThisCategory
не изменяется несколькими потоками одновременно (или переключается на ConcurrentHashMap
), и убедитесь, что он не изменен toString()
запущен (вызывается при создании отладочной информации).
HashMap не обеспечивает многопоточность. Вы можете попробовать использовать Collections.synchronizedMap()
обернуть ваш экземпляр hashMap или использовать ConcurrentHashMap
может быть лучше