面试中经常会问的一个问题,一个关键字涉及的知识点其实很多。
阿里一面被问到这个问题,答得一般,这里梳理一下。
1.Java虚拟机内存模型
懂得这一点是理解volatile的关键。Java虚拟机运行时数据区图如下(盗图莫怪):
每个线程都会有专属的栈区,方法区和堆区为线程共享。
这里有个概念区分:主内存和工作内存,主内存可以理解为共享区域,工作内存为线程私有区域,工作内存的数据需要从主内存中加载。
特征:
非volatile变量,仅在第一次引用时加载
volatile变量,每一次引用都需要重新从主内存中读取加载
2.volatile保证了主内存数据对工作内存的可见性,即工作内存每次使用的数据都是主内存最新的
3.volatile无法保证线程间的可见性,所以仍然存在线程安全问题,对于存在状态依赖 的操作需要做同步处理,保持原子性。