这是在多线程下
我已阅读有关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:2016年4月7日13:47:06,661调试[WirePushNotificationSyncHandler :: WirePushNotification.Worker-1]-eventsForThisCategory是{FX_WIRE_DATA =关键经济数据,ALL_FX_WIRE =全部,ALL_FX_WIRE =全部,FX_WIRE_HEADLINES =关键


这怎么可能?

最佳答案

我很确定您的地图不会同时有两个相等的键。您看到的是在迭代地图时(在toString()中)修改地图的效果。当写入第二个“ ALL_FX_WIRE”时,第一个将不再出现在地图中。

您已经知道HashMap不是线程安全的。加号eventsForThisCategory可以在eventsForThisCategory.toString()运行时被另一个线程修改。因此,这是可以预料的。

确保eventsForThisCategory没有同时被多个线程修改(或切换到ConcurrentHashMap),并确保在运行toString()时未对其进行修改(在创建调试输出时调用)。

10-06 13:08