对Java中volatile修饰符的理解

14 篇文章 0 订阅

由于CPU的执行速度要高于内存读取数据的速度,所以将需要运算的数据复制一份到CPU的高速缓存中,也就是给当前运行线程的运行内存的高速缓冲中放入副本。线程第一次运行从主存中将变量拿到高速缓冲中,以后每次线程运行所需变量都从该线程自己的高速缓存中取,而不是从主存中,运算结束后再将高速缓冲中的数据刷新到主存中。
在这里插入图片描述

引出问题

  • 在并发环境下,由于线程总是从自己的高速缓冲中读取变量,如果主存中的变量已经被其它线程修改,则高速缓存中的值与主存中的值不一致;
    在这里插入图片描述
  • 处理器为了保证程序运行的效率,处理指令的顺序可能不会按代码的先后顺序执行,但是它还是会依靠计算结果的依赖性保证指令重排序后运算的结果与原来相同。

处理问题

  • 可见性: 加了volatile的变量表示该变量是不稳定的,所以线程每次是直接从主存中读取,而不是从自己的高速缓冲区中读取了,所以每次取到的都是最新的值;即一个线程对volatile的修改对另一个线程可见;
    在这里插入图片描述
  • 有序性:第三个问题是运行程序的有序性,被volatile修饰的变量不会被重排序,也就是说处理器会按照代码的先后顺序来执行指令,不会进行指令优化。

与同步代码块synchronized的区别
synchronized能保证原子性操作,而volatile不能保证原子性。但缺点是sychronized是属于重量级操作,性能相对更低;

CPU缓存一致性协议MESI

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值