您当前的位置: 首页 >  面试

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

发布时间:2020-11-07 01:27:18 ,浏览量:0

面试题

开启一个线程死循环执行任务,一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方法保证原子性。

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0431s