大厂面试题集之volatile到底怎么用?
【摘要】 面试题
开启一个线程死循环执行任务,一bool类型标识控制循环的退出,默认为true代表执行,一段时间后主线程将这个变量设置为了false。
若该变量未被volatile修饰,子线程还能退出吗?
原理
volatile的问题:可见性问题和禁止指令重排序优化。 可见性问题:本质上是CPU缓存失效,必须从主内存读取数据; 禁止指令重排序优化:x86处理器仅下,只实...
面试题
开启一个线程死循环执行任务,一bool类型标识控制循环的退出,默认为true代表执行,一段时间后主线程将这个变量设置为了false。
- 若该变量未被
volatile
修饰,子线程还能退出吗?
原理
volatile的问题:可见性问题和禁止指令重排序优化。
可见性问题:本质上是CPU缓存失效,必须从主内存读取数据;
禁止指令重排序优化:x86处理器仅下,只实现了volatile的读写内存屏障,也就是store load,也就是写读,本质上也就是读写可见性,happen-before原则。
实现原理是通过寄存器esp实现的。
当然也不会退出循环,因为cpu缓存到主内存的同步不是实时的。
解决方案
所以不能退出。必须加volatile,因为volatile保证了可见性。改完后会强制让工作内存失效,去主存拿。如果不加volatile的话那么在while true里面添加输出语句也是OK的。因为println源码加锁了,sync会让当前线程的工作内存失效。
或使用AtomicBoolean/AtomicReference等也行,后者相比volatile除了确保可见性还提供了CAS方法保证原子性。
文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。
原文链接:javaedge.blog.csdn.net/article/details/109542256
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)