并行流的线程安全问题(parallelStream)
问题代码
Map<String, Object> madData = new HashMap();
List<String> list = paramVo.getList();
list.parallelStream().forEach(e -> {
madData.put(e,e);
});
return mapData;
问题现象
map中数据随机缺失,不全。
问题原因
往普通的collection中add数据时会出现抢占资源的线程问题。导致数据随机缺失。
解决方案
- 给collection上锁
Map<String, Object> madData = Collections.synchronizedMap(Maps.<String, Object> newHashMap());
List<String> list = paramVo.getList();
list.parallelStream().forEach(e -> {
madData.put(e,e);
});
return mapData;
- 使用java8中的收集器
List<String> list = paramVo.getList();
Map<String, String> mapData = list.parallelStream().collect(Collectors.toMap(e -> e, e -> e));
return mapData;