阿里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方法保证原子性。
往期推荐
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~