volatile原理和使用场景

volatile 关键字只能用于修饰变量,无法用于修饰方法。并且 volatile 只能保证可见性,但不能保证操作的原子性。

在具体编程中体现为:volatile 只能保证基本类型以及一般对象的引用赋值是线程安全的。

volatile工作原理

为什么 volatile 只能保证可见性,不能保证原子性呢?这跟它的工作原理有关。

  • 线程写 volaitle 变量的步骤为:

    • 改变线程工作内存中 volatile 变量副本的值

    • 将改变后的副本的值从工作内存刷新到主内存

  • 线程读 volatile 变量的步骤为:

    • 从主内存读取 volatile 变量的最新值到线程的工作内存中

    • 从工作内存中读取 volatile 变量的副本

由于在整个过程没有涉及到锁相关的操作,所以无法保证原子性,但是由于实时刷新了主内存中的变量值,因此任何时刻,不同线程总能看到该变量的最新值,保证了可见性。

volatile使用场景

要在多线程中安全的使用 volatile 变量,必须同时满足:

  • 对变量的设置操作不依赖其当前值

    • 不满足举例:number++、count = count + 5
    • 满足举例: boolean 变量等
  • 该变量没有包含在具有其他变量的不等式中

    • 不满足举例:不变时 low < up

    在实际项目中,由于很多情况下都不满意 volatile 的使用条件,所以 volatile 使用的场景并没有 synchronized 广。

扫描二维码,关注公众号“猿必过”

file

回复 “面试题” 自行领取吧。

微信群交流讨论,请添加微信号:zyhui98,备注:面试题加群

本文由猿必过 YBG 发布 禁止未经授权转载,违者依法追究相关法律责任 如需授权可联系:zhuyunhui@yuanbiguo.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值