Volatile关键字

首先,介绍volatile之前,咱们知道一下JMM–java内存模型,
线程解锁前,必须把共享变量存入主存。(咱们每一个线程都有自己的工作内存,操作变量是自己内存块的变量,但实际存在的位置是主存,所以每次操作完成后都需要刷入主存。)
线程加锁前,必须从主存当中读取最新变量到工作内存。

JMM的八个操作分别是
read(读取) load(加载)
use(使用) assign(赋值)
store(存储) write(写入)
lock unlock
在这里插入图片描述
这个时候有可能多个线程同时从主存read值,A线程write新值后,B线程工作内存仍是旧值的情况。
这个时候就可以用volatile关键字来解决这个问题

volatile是Jvm提供的轻量级的同步机制,有以下三大特点
保证线程变量间可见性
不保证原子性
禁止CPU对指令重排

首先第一点,保证可见性,也就是说,加了volatile的变量,咱们线程A对变量进行更新后,会立即将最新值刷入主存,那么线程B每次使用变量之前,都从主存刷新,本质上是通过内存屏障来实现。
第二点,不保证原子性,咱们n++的底层操作不是原子性的,会有三个过程,读取,修改,写入。可以使用synchronize或者Lock锁进行解决,或者JUC下的ActomicInteger,调用UnSafe方法(C++),底层使用的是CAS
第三点,禁止指令重排,处理器会根据数据之间的依赖性,进行指令操作,volatile提供了内存屏障,会避免指令重排
加入volatile关键字和没加入volatile关键字是所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令,这个lock前缀指令实际上相当于一个内存屏障
内存屏障提供了三个功能:
它确保指令重排序时,不会把后面的指令排到内存屏障之前,同样也不会把前面的指令排到内存屏障之后,也就是说,执行到内存屏障这句指令时,前面的操作都已经完成。
它强制将对缓存的修改立即写入主存
将其他cup对应的缓存行无效
典型的使用场景DCL;对象创建过程,实例化,赋值,初始化,若后两步重排,会创建半对象,避免创建半对象:volatile

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值