volatile官方文档解释

一、描述:

官方文档中对volatile中描述中,写到:

This means that changes to a volatile variable are always visible to other threads. What's more, it also means that when a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.

这句话前半段很好理解,可以解释为:用volatile修饰的变量对其他变量是可见的,volatile变量总是可以读取到对该变量的最新修改值。而后半段“but also the side effects of the code that led up the change”,不太好理解,直译为:也会受到改变volatile变量值的代码的副作用影响。那么什么是副作用影响呢,官方文档中并没有给出具体例子。

 

二、解释:

副作用影响为没有对volatile变量执行原子操作,volatile只对读、写两种操作具有原子,如果一个变量用volatile修饰,但是对该变量的操作并没有执行原子操作,那么读取到该变量的值会错误,如下例子:

volatile int i = 0; 

线程1
i++;


线程2
print(i);

线程1对变量 i 执行了加操作,在进行加1的过程中,线程2读取了变量 i,那么线程2读取的变量值可能为0或者1,因为i++不是原子操作,如果不使用锁的情况下,让线程2读取的值为1,可以做以下修改:

volatile int i = 0; 

线程1
i=1;


线程2
print(i);

线程1将变量加1的操作改为了赋值1,因为volatile单独赋值时原子性的,并且在线程1执行过程中,是符合happen-before线程2的,所以线程2读取的值为1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值