首先思考,volatile关键字是用来干什么的?
首先看一下什么是可见性: 定义一个boolean型变量,然后阿巴阿巴阿巴阿巴(看代码看代码) 代码示例:
执行以上代码,大家猜结果是什么?
没错,该线程一直执行,并没有因为stop值的改变而停止。 因为该线程执行时stop的值 并没有因为主线程修改了stop值而被修改。 也就是说主线程的操作结果对于该线程来说是不可见的。
而当我们在stop上加上volatile关键字之后:
该线程就捕捉到了stop值的改变 (结果为付是因为结果超出了int的最大值) 换句话说,volatile关键字使这个变量在线程间变成了互相可见的
这里放出原理,不过是汇编层面的,大家当面试题记一下就好,不必深入追究
加了volatile关键字的变量,在字节码文件里,变量前面会加一个lock指令
那么,我们什么时候需要用到volatile关键字呢? 就如同上面那个例子一样
当存在多个线程对同一个共享变量进行修改的时候,需要增加volatile,保证数据修改的实时可见
本质上来说,volatile关键字实际上是通过内存屏障来防止指令重排序以及禁止CPU高速缓存来解决可见性问题。