1.错误:
tokenInfo.getRoleIdSet().parallelStream().map(roleId -> {
SysRole role = new SysRole();
role.setId(roleId);
return role;
}).forEach(role -> securityUser.getRoleList().add(role));
securityUser.getRoleList()是ArrayList,是线程不安全的。
2.改正:
tokenInfo.getRoleIdSet().parallelStream().map(roleId -> {
SysRole role = new SysRole();
role.setId(roleId);
return role;
}).collect(Collectors.toSet()).forEach(role -> securityUser.getRoleList().add(role));
3.解决方案:
- 将securityUser.getRoleList()的ArrayList改为CopyOnWriteArrayList。
- 继续使用ArrayList,同时parallelStream()和forEach()之间调用一次collect()(图中用的是这一种)。
- 用stream()代替parallelStream()。
本文探讨了在Java中使用并行流处理集合时遇到的并发修改异常问题,并提供了几种解决方案,包括使用CopyOnWriteArrayList、在parallelStream与forEach间加入collect操作以及改用串行流。
615





