复习整理篇-volatile关键字

volatile关键字浅析


1.volatile关键字的两层含义

 一旦一个变量(类成员变量、类的静态成员变量)被volatile修饰之后,就具备了两层含义:
  ①保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其它线程来说是立即可见的。
  ②禁止进行指令重排序

2.volatile保证原子性吗?

 volatile关键字保证了操作的可见性,不能保证对变量的任何操作都是原子性的。

3.volatile保证有序性吗?

 volatile在一定程度上保证有序性。
 volatile关键字禁止指令重排序有两层意思:
  ①当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行
  ②在进行指令优化时,不能将在对volatile变量访问的语句放在其后面进行,也不能把volatile变量后面的语句放到其前面执行。

4.volatile原理和实现机制

 观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码实现,加入volatile关键字时,会多出一个lock前缀指令:
 lock前缀指令实际上相当于一个内存屏障(也称内存栅栏),内存屏障提供3个功能:
  ①它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
  ②它会强制将对缓存的修改操作立即写入主存;
  ③如果是·写操作,它会导致其它CPU中对应的缓存行失效

5.使用volatile关键字场景

 synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:
  ①对变量的写操作不依赖于当前值;
  ②该变量没有包含在具有其他变量的不变式中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值