阿里P6面试题集之volatile到底怎么用?

  点击上方“JavaEdge”,关注公众号

设为“星标”,好文章不错过!

面试题

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

往期推荐

阿里P8架构师教你kill代码重复/大量ifelse

一文讲清RedisCluster

阿里Java架构师教你写代码-如何校验参数?

你真的深知JWT(JSON Web Token)了吗?

OAuth 2.0实战(一)-通俗光速入门

目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群

喜欢文章,点个“在看、点赞、分享”素质三连支持一下~

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注