并行流的线程安全问题(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;
posted @ 2022-05-31 11:08  阿步呦  阅读(770)  评论(2编辑  收藏  举报