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的信息
  • 在并发时可以保证读取的最新的,但是不能保证对变量的操作是互斥以及顺序执行的
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 到现在为止,我依然是只有单线思维的简单动物,一根轴,不仅仅是不知变通,甚至可以说是根本就没有多种解法的念头,在结束...
    Violet蝉阅读 198评论 0 0
  • 我问:为何世间那么多的别离与相见 月言:花开了一树,也落了一地 既有相见时的狂喜,便会离别时候忧郁 我...
    三条命的猫阅读 343评论 0 7
  • 最近一段时间突然对流程、制度、约束,有了极深的迷恋,真想不到这种事居然会发生在曾经那么迷信“聪敏机灵”的自己身上。...
    阿弼_阅读 215评论 0 0
  • 昨儿调休一天,同事、朋友都在上班,无人可约,无奈之下打开电脑登上QQ,想要找那些曾经熟悉但是又很久都未见的朋友,滚...
    唐青竹阅读 172评论 0 0