热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析volatile的工作原理与实现机制:系统级详解及MESI协议综述

本文深入探讨了`volatile`关键字的工作原理及其在多线程环境中的实现机制,从系统级视角详细分析了其内存模型和同步特性。文章还综述了MESI协议,解释了该协议如何在多核处理器中确保数据的一致性和缓存的有效性,为开发者提供了全面的理解和实践指导。

https://blog.csdn.net/jjavaboy/article/details/77164474
http://www.infoq.com/cn/articles/ftf-java-volatile

volatile原理

底层是靠一个lock指令来保证顺序性和 可见性
1.lock指令会引起处理器中的工作缓存的数据强制写回到工作内存
2.lock指令会令其它CPU的工作内存中对应的这个共享变量的缓存行无效(在第一步写回内存中后,每个处理器都会有一个嗅探机制,去看自己的工作内存中的数值与主内存中那个的是否一致,不一致,会将自己的工作内存中的数值设置成无效,同时会从主内存中读取数值更新到自己的工作内存中 注:下图中的Cache就是每个CPU的工作内存)
这里写图片描述
3.禁止指令重排序
这里写图片描述
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:

  1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;

  2)它会强制将对缓存的修改操作立即写入主存;

  3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
内存屏障指令帮助vllatile具有可见性和有序性,内存屏障,又称内存栅栏,是一个CPU指令,它的作用有两个,一是保证特定操作的执行顺序,二是保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)。由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序,也就是说通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化。Memory Barrier的另外一个作用是强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版本。总之,volatile变量正是通过内存屏障实现其在内存中的语义,即可见性和禁止重排优化。
volatile系统级别原理:
全面理解Java内存模型(JMM)及volatile关键字
我是看完这篇文章后,有了自己的一些感悟,如有不对,欢迎指出。
这里写图片描述
这里写图片描述
看着两张图,每个任务根据一对一原则对应一个操作系统的内核线程,操作系统将内核线程与CPU进行一一对应,而CPU存在缓存(cpu缓存是对应的线程的工作内存),也就是自己对于主存数据的一份拷贝,会去利用缓存一致性协议保证内存的可见性。

MESI(缓存一致性协议)

它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。


推荐阅读
  • 在探索 Unity Shaders 的过程中,我逐渐意识到掌握 OpenGL 基础知识的重要性。本文将详细介绍 OpenGL 的核心概念和基本操作,帮助读者从零开始理解这一图形编程技术。通过实例和代码解析,我们将深入探讨如何利用 OpenGL 创建高效的图形应用。无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 本文总结了 Apache Shiro 安全框架的学习体会,并通过具体应用实例进行了详细分析。Apache Shiro 是一个强大且灵活的安全框架,适用于各种应用程序的安全需求。通过对该框架的核心功能和使用方法的深入探讨,本文不仅帮助读者理解其基本概念和架构设计,还提供了实际项目中的应用示例,以便更好地掌握和运用这一工具。特别感谢开涛的博客文章,为本文提供了宝贵的参考和启发。 ... [详细]
  • 本文深入探讨了ASP.NET Web API与RESTful架构的设计与实现。ASP.NET Web API 是一个强大的框架,能够简化HTTP服务的开发,使其能够广泛支持各种客户端设备。通过详细分析其核心原理和最佳实践,本文为开发者提供了构建高效、可扩展且易于维护的Web服务的指导。此外,还讨论了如何利用RESTful原则优化API设计,确保系统的灵活性和互操作性。 ... [详细]
  • 博主通常比较偏爱前端工具,而开发者和设计师则比较关注对站点的处理——他们必须从后端确保那个站点的脚本可以正常运行。有时,出现问题之后很难发现。通常&#x ... [详细]
  • 下面简单介绍一下spring3.1.M1中的cache功能。 spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M ... [详细]
  • 深入解析Java内存架构、垃圾回收机制与内存泄漏问题
    Java内存架构(Java内存模型)上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的Pe ... [详细]
  • 本文详细探讨了 Java 中定义宏的方法,并与 C++ 中的 `#define` 用法进行了对比。通过具体示例,深入解析了两者在预处理阶段的不同机制及其应用场景,帮助开发者更好地理解和选择合适的宏定义方式。 ... [详细]
  • Android数组截取技巧及JNI数组交互在仓库构建中的应用分析
    在Android开发中,数组截取技巧和JNI数组交互在仓库构建中的应用具有重要意义。JNI提供了两种主要的数组处理方法:一是生成原生层数组的副本,二是直接通过数组指针进行操作。在进行字符串处理时,如果需要执行其他复杂操作,可以结合这两种方法以提高效率和灵活性。此外,合理利用这些技术可以显著提升应用程序的性能和稳定性。 ... [详细]
  • 一键将应用部署至远程服务器,体验超乎想象的便捷与高效
    该插件作为IDEA的内置功能,用户可以直接启用,无需额外安装。通过简单的配置,即可实现应用的一键部署至远程服务器,极大地提升了开发效率和便捷性。插件支持镜像管理和容器管理,允许用户与容器进行交互,并且兼容Docker Compose,适用于复杂的多容器应用部署。总结部分详细介绍了插件的使用方法和优势,附带的参考资料和项目源码地址为用户提供更多学习和实践资源。 ... [详细]
  • 本文深入探讨了Linux内核网络协议栈中sk_buff结构体的操作函数,详细解析了其在数据包处理过程中的关键作用与实现机制,为开发者提供了深入了解和优化网络性能的宝贵资源。 ... [详细]
  • 01基本环境win10vs2015Gitpython3.5.3cmake-gui(3.7.2)caffe2github地址:https:github.com ... [详细]
  • 安卓和ios是什么意思安卓和iOS是移动设备上的两款操作系统。安卓英文名为Android,是美国谷歌公司基于Linux内核开发的操作系统。iOS原名iPhoneOS,是由美国苹果公 ... [详细]
  • Java体系化进阶学习图谱:java进阶路线图
    第一篇Linux基础学习篇目录第零章﹑计算机概论关于电脑的硬件组成部分﹐其实你可以观察你的台式机来分析一下﹐依外观来说这家伙主要可分为三部分﹐分别是∶输入单元∶包括键盘﹑鼠标﹑读 ... [详细]
  • 一、echo设置字体颜色表示方法echo–e“\033[3#;4#;#语句\033[0m”3#,代表控制前景色4#,代表控制背景色#,代表字符格式(加粗、下划线、闪烁等)3#中的# ... [详细]
author-avatar
zx15899966868
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有