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

  1. Это под многопоточностью
  2. Я прочитал темы о 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 может быть лучше

Другие вопросы по тегам