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()。