这是在多线程下
我已阅读有关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()
时未对其进行修改(在创建调试输出时调用)。