标签:触发 java 按值 fault 传递 线程 堆栈 lambda
由lambda和线程池搭配引发的segment fault,顺便聊一下为什么java里的lambda设计成了按值传递
BUG属性:偶发型BUG,无法精准触发
对bev的引用捕获,会因为bev存储的值随着堆栈的变化而发生SF
触发过程:多线程下的操作
- 线程池线程耗尽情况下,任务压进任务队列中存储
- 在轮到此任务执行时,触发segment fault
触发条件:
- 压入的任务没有立即处理(其实就算立即处理也有可能触发SF)
- 任务引入了外部堆栈上的变量
总结:在利用lambda给线程池派发任务时,捕获变量最好使用pass by value;(假设入参是通过引用(指针1)传递进来的,可以再次通过引用(指针2)把值传递进lambda,(这里指针1和2归属于不同的堆栈地址上,但是所存储的值都是一样的), 只要这个内存空间原本就是在堆上,并且在执行lambda之前没有被回收,那么这块内存空间就是可访问的,但是需要很细心才能这样使用,使用前请了解清楚其用法带来的心智负担)
最后解决方式:将引发SF的变量通过pass by value传递进去
话题延伸:为什么java里的lambda设计成了按值传递?
假设java在使用保存并传递lambda时,堆栈弹栈了,并且lambda内部变量所引用的指针,所指向的地址发生了变化,就会引发异常。
标签:触发,java,按值,fault,传递,线程,堆栈,lambda 来源: https://www.cnblogs.com/zedian752/p/16372934.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。