parallelStream使用不当引发的血案
Stream简洁
问题场景描述
- 我们的系统中使用了一个会话管理器的东西,就是利用ThreadLocal来制造了一个线程变量,存放每次请求的会话线程的线程变量。
- 有一个程序变量需要遍历取值,并且需要对其中的值和线程变量的值来做业务判断,进行处理.
- 之前使用Stream进行流操作,未发生任何异常.
问题发生情况描述
- 想使用parallelStream提升遍历性能,就将stream改成了parallelStream.
- 这时候重启调试之后,请求这个api,总是发生空指针的异常.
问题定位
- 因为使用了lambda表达式,所以控制台只是提示parallelStream的遍历这一行报错(这也是使用lambda的不便之处,调错没有之前方便)
- 使用debug一步步跟随调试,发现错误定位在了会话管理器获取线程变量这一行
问题思考
- 之前在使用stream这个API的时候没有发生问题,便思考到了是parallelStream的原因使得程序产生了问题.
- 那么parallelStream怎么会影响我们的会话管理器取得线程变量呢.
问题解决
- 查看parallelStream的源码
- parallelStream是创建一个并行的Stream,而且他的并行操作是不具备线程传播性的,所以在使用会话管理器的时候是无法获取值的.
问题总结
parallelStream是一把双刃利器,他的并行操作可以在很多时候作为提升效率的一把利刃。但是使用的时候仍需要注意一些东西,以免伤到自己。
上一篇:
Java架构师技术进阶路线图
下一篇:
如何学黑客并从事网络安全