面试题:请你说下volatile这个关键字,volatile原理是什么?

26 篇文章 4 订阅

面试题:请你说下volatile这个关键字,volatile原理是什么?

题目分析

此题考察的是volatile这个关键字。可以从volatile的作用和volatile的原理这三个方面来进行回答。volatile只能保证变量的可见性、有序性,但是不能保证原子性。

题目回答

volatile的作用

  1. 保证内存可见性:一个线程对一个volatile变量的修改,对于其它线程来说是可见的。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
  2. 禁止指令重排序

volatile的原理

可见性实现

线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存来完成相应的操作。这也是导致线程间数据不可见的本质原因。对volatile变量的写操作与普通变量的主要区别有两点:

  1. 修改volatile变量时会强制将修改后的值刷新的主内存中。
  2. 修改volatile变量后会导致其他线程工作内存中对应的变量值失效。因此,再读取该变量值的时候就需要重新从读取主内存中的值。
有序性实现

volatile是通过编译器在生成字节码时,在指令序列中添加“内存屏障”来禁止指令重排序的。多核处理器需使用内存屏障指令来确保一致性。

  1. 属性添加了volatile关键字之后,编译之后的属性会被添加ACC_VOLATILE访问标记。
  2. 获取和设置静态属性的字节码是putstaticgetstatic,获取成员变量的字节码是putfieldgetfield,在这些字节码的代码中,会先判断字段是否被ACC_VOLATILE修饰,即判断字段是否为volatile字段,若是,则会在操作之后,加上内存屏障。
  3. 添加内存屏障之后的代码,内存屏障之后的代码会在内存屏障之前的代码执行完之后再执行。

这样就保证了有序性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值