面试题:请你说下volatile这个关键字,volatile原理是什么?
面试题:请你说下volatile这个关键字,volatile原理是什么?
题目分析
此题考察的是volatile
这个关键字。可以从volatile
的作用和volatile
的原理这三个方面来进行回答。volatile只能保证变量的可见性、有序性,但是不能保证原子性。
题目回答
volatile的作用
- 保证内存可见性:一个线程对一个volatile变量的修改,对于其它线程来说是可见的。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
- 禁止指令重排序
volatile的原理
可见性实现
线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存来完成相应的操作。这也是导致线程间数据不可见的本质原因。对volatile
变量的写操作与普通变量的主要区别有两点:
- 修改volatile变量时会强制将修改后的值刷新的主内存中。
- 修改volatile变量后会导致其他线程工作内存中对应的变量值失效。因此,再读取该变量值的时候就需要重新从读取主内存中的值。
有序性实现
volatile
是通过编译器在生成字节码时,在指令序列中添加“内存屏障”来禁止指令重排序的。多核处理器需使用内存屏障指令来确保一致性。
- 属性添加了
volatile
关键字之后,编译之后的属性会被添加ACC_VOLATILE
访问标记。 - 获取和设置静态属性的字节码是
putstatic
和getstatic
,获取成员变量的字节码是putfield
和getfield
,在这些字节码的代码中,会先判断字段是否被ACC_VOLATILE
修饰,即判断字段是否为volatile
字段,若是,则会在操作之后,加上内存屏障。 - 添加内存屏障之后的代码,内存屏障之后的代码会在内存屏障之前的代码执行完之后再执行。
这样就保证了有序性。