亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

parallelStream使用不當引發的血案

標簽:
Java

Stream简洁

众所周知,java8的新特性中出了lambda表达式之外最受人关注的还有stream一系列的api。
parallelStreamstream中的一个很受开发者喜欢的api,喜欢的同时,如果你使用不当也会造成一些在你看来莫名其妙的问题。
下面我就跟大家说一下在我是如何使用不当遇到那个让我感到奇怪的问题

问题场景描述

  1. 我们的系统中使用了一个会话管理器的东西,就是利用ThreadLocal来制造了一个线程变量,存放每次请求的会话线程的线程变量。

  2. 有一个程序变量需要遍历取值,并且需要对其中的值和线程变量的值来做业务判断,进行处理.

  3. 之前使用Stream进行流操作,未发生任何异常.

问题发生情况描述

  1. 想使用parallelStream提升遍历性能,就将stream改成了parallelStream.

  2. 这时候重启调试之后,请求这个api,总是发生空指针的异常.

问题定位

  1. 因为使用了lambda表达式,所以控制台只是提示parallelStream的遍历这一行报错(这也是使用lambda的不便之处,调错没有之前方便)

  2. 使用debug一步步跟随调试,发现错误定位在了会话管理器获取线程变量这一行

问题思考

  1. 之前在使用stream这个API的时候没有发生问题,便思考到了是parallelStream的原因使得程序产生了问题.

  2. 那么parallelStream怎么会影响我们的会话管理器取得线程变量呢.

问题解决

  1. 查看parallelStream的源码

    https://img1.sycdn.imooc.com//5d5e58d80001aee007590405.png

    parallelStream源码

    .

  2. parallelStream是创建一个并行的Stream,而且他的并行操作是不具备线程传播性的,所以在使用会话管理器的时候是无法获取值的.

问题总结

parallelStream是一把双刃利器,他的并行操作可以在很多时候作为提升效率的一把利刃。但是使用的时候仍需要注意一些东西,以免伤到自己。

作者:jsondream
链接:https://www.jianshu.com/p/5a49b10f3cfd


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消