面经-并发-volatitle
volatitle能否保证线程安全?
线程安全要考虑三个方面:可见性,有序性,原子性。
1.可见性:一个线程对共享变量修改,另一个线程能看到最新结果。
2.有序性:一个线程内代码按照编写顺序执行。
3.原子性:一个线程内多行代码以一个整体运行,期间不能有其他线程代码插队。
volatile能够保证共享变量的可见性和有序性,不能保证原子性。
原子性:
一个线程执行时,可能进行了变量操作,但并未保存,此时另一个线程插队又对此变量进行操作,导致最后变量结果出问题。
可见性:
当CPU多次从内存中拿到同一个值时,JIT对代码进行优化:直接将拿到值后的代码缓存,提高性能。此时线程2再对内存中的变量进行操作,原先的线程就陷入死循环。而后续的线程3则可读到改变后的代码。
解决办法:使用volatile。JIT发现变量使用volatile修饰,则不对这个变量进行优化。
有序性:
指令重排序。可以通过volatile禁止。
原理:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性