对于C/C++,java的volatile关键字的个人理解

11 篇文章 0 订阅
8 篇文章 0 订阅

C/C++中的volatile是禁止编译器对变量的操作进行优化,每次读取需要从内存读取,不允许从cpu缓存或者寄存器中取值。

参考文章:http://blog.csdn.net/qq_29350001/article/details/54024070

java中volatile有主要2个功能

第一个,禁止重排序,在变量前与变量后的语句即使重排序也不会交换到变量的前面或者后面。

int a=1;//可能与b重排序
int b=2;//可能与a重排序
volatile int c=3;//下面或者上面的代码可能会重排序,但是不会越过变量c的定义
int d=4;//可能与e重排序
int e=5;//可能与d重排序

第二个,同步多线程变量的值(保证多线程同个变量的可见性

文章地址:http://www.importnew.com/27002.html

当写两条线程Thread-A与Threab-B同时操作主存中的一个volatile变量i时,Thread-A写了变量i,那么:

  • Thread-A发出LOCK#指令
  • 发出的LOCK#指令锁总线(或锁缓存行),同时让Thread-B高速缓存中的缓存行内容失效
  • Thread-A向主存回写最新修改的i

Thread-B读取变量i,那么:

  • Thread-B发现对应地址的缓存行被锁了,等待锁的释放,缓存一致性协议会保证它读取到最新的值

另外还有关于CAS指令https://www.jianshu.com/p/fb6e91b013cc

CASCompareand Swap,比较并交换主要实现对于一个变量i++做原子操作,保证一个++操作是原子性的

比较并交换是两个操作,本身不是原子性的,要保证原子性的话 需要锁定内存不能被其它线程使用,或者使用锁缓存,当其它线程使用这片内存之后,立即重新读取这片内存,获得新值在进行CAS操作。

在做CAS操作前也需要发出lock指令,进行锁定;

Lock前缀指令会引起处理器缓存回写到内存。Lock前缀指令导致在执行指令期间,声言处理器的 LOCK# 信号。在多处理器环境中,LOCK# 信号确保在声言该信号期间,处理器可以独占使用任何共享内存。(因为它会锁住总线,导致其他CPU不能访问总线,不能访问总线就意味着不能访问系统内存),但是在最近的处理器里,LOCK#信号一般不锁总线,而是锁缓存,毕竟锁总线开销比较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值