栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发编程系列:详解volatile关键字

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发编程系列:详解volatile关键字

在整个并发知识体系(不断扩充)下,本文主要讨论的内容:

一、简介

volatile可以说是java虚拟机提供的最轻量级的同步机制,因为它不会引起线程上下文的调度和切换,执行成本比synchronized低。Java内存模型(JMM)告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中?这个时机对普通变量是没有规定的,而针对volatile修饰的变量给java虚拟机特殊的约定,线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的“可见性”。

二、volatile实现原理
  • Lock前缀指令
  • MESI协议

在此处要引入一个硬件知识,就是CPU Cache(高速缓存),计算机的存储层次为寄存器、cpu cache、内存、磁盘。cpu不会直接和内存进行交互,他们之间有一个cpu cache作为缓存,提高系统的运行速度。
一个volatile变量,在生成汇编代码时会在volatile修饰的共享变量进行写操作的时候会多出Lock前缀的指令

volatile实现原理:

  • 1、Lock指令会引起处理器将缓存写回到内存
    如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存
  • 2、使用EMSI或嗅探机制保证缓存一致性
    但是写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。所以,在多处理器下,为了保证各个处理器的缓存是一致的,就需要缓存一致性协议:MESI、总线嗅探机制。不懂这两个名词的可以自行查阅,涉及到cpu cache缓存一致性知识,还可以拓展cache伪共享问题,cpu cache 存储结构,这里不再详细叙述。

上面的讲解其实也就是保证了volatile的可见性。

三、volatile内存语义 四、如何保证有序性 五、参考资料
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/952802.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号