大厂面试题集之volatile到底怎么用?

举报
JavaEdge 发表于 2021/06/03 23:33:01 2021/06/03
【摘要】 面试题 开启一个线程死循环执行任务,一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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。