volatile关键字-阿里云开发者社区

开发者社区> 开发与运维> 正文

volatile关键字

简介: volatile关键字 @Date 2016.06.20 共享变量 多个线程之间能够被共享的变量 存放在堆内存中的实例变量,静态变量,数组变量 内存屏障 CPU指令,用于实现对内存操作的顺序限制 Volatile 确保所有线程看到...

volatile关键字

@Date 2016.06.20

共享变量

  • 多个线程之间能够被共享的变量
  • 存放在堆内存中的实例变量,静态变量,数组变量

内存屏障

  • CPU指令,用于实现对内存操作的顺序限制

Volatile

  • 确保所有线程看到这个变量的值是一致的
  • 不会引起线程上下文的切换和调度
  • JVM就会向处理器发送一条Lock前缀的指令
  • 缓存一致性协议: 当处理器发现自己缓存行对应的内存地址被修改,会将当前处理器的缓存行设置成无效状态
  • 将当前处理器缓存行的数据会写回到系统内存
  • 写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效
  • 大多数处理器高速缓存行是64个字节宽
  • 保证了可见性(对于一个变量i,多个线程同时去操作(比如++),i的值一定是0->1->2->3,而如果不加volatile则i的值可能是0->1->1->2)
  • 不保证顺序性和原子性(volatile不会锁住变量,你再对第一个变量i做完操作之后,下一个volatile变量j可能已经发生改变了)

补充

  • 强制线程去主存中读取Heap的信息
  • 在并发时可以保证读取的最新的,但是不能保证对变量的操作是互斥以及顺序执行的

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章