volatile的原理和实现机制 系统级别原理 MESI协议 总结笔记

2023-11-05

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需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

volatile的原理和实现机制 系统级别原理 MESI协议 总结笔记 的相关文章

  • 2022年Java秋招面试,程序员求职必看的ZooKeeper面试题

    前言 大公司面试特别喜欢问 Zookeeper 因为 Zookeeper 确实是足够的优秀 比如他的 Paxos 算法 Zab 协议 Leader 选举策略 分布式锁等都是大厂面试的高频考点 我们不仅需要熟悉使用 Zookeeper 更要了
  • 牛客网剑指offer java 全部题解

    经过数月的努力 终于更完了牛客网的66道剑指offer 以下的顺序和大家在牛客网的顺序是一样的 排序也花了不少时间 希望对大家找工作 提高算法能力能起到些许帮助 每天一道剑指offer 二维数组中的查找 https mp weixin qq
  • Java面试八股文宝典:序言

    序言 Java作为一门广泛应用于企业级应用开发的编程语言 一直以来都是技术面试中的重要话题 无论您是刚刚踏入编程世界的新手 还是经验丰富的Java开发工程师 都需要通过面试来展示自己的技能和知识 在面试中 除了技术知识 还需要展现出解决问题
  • Java面试:Java的特征是什么?分别解释一下?什么是面向对象?

    什么是面向对象 对象就是存在的具体实体 具有状态和行为 如汽车有牌子和大小等属性 会跑等等行为 面向对象编程就是借助对象的描述在计算机中模拟真实的世界 Java的特征是什么 封装 继承 多态 封装 把类内部的具体实现与外界隔离起来 把实现方
  • 面试进阶必问的Redis,看这篇就够了!

    出自 https github com CyC2018 CS Notes 一 概述 二 数据类型 STRING LIST SET HASH ZSET 三 数据结构 字典 跳跃表 四 使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式
  • JHipster介绍:一个适用于Java和JavaScript的全栈框架

    JHipster介绍 Java和JavaScript的全栈框架 JHipster是一个用于生成混合Java和JavaScript应用程序的成熟框架 它支持你所喜爱的开发工具 并提供监控和其他开箱即用的管理功能 JHipster是一个历史悠久
  • 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明 https blog csdn net WantFlyDaCheng article details 100078782 一 框架是重点 但别让人感觉你只会山寨别人的代码 二 别单纯看单机版的框架 适当了解些分布式 三 数据库方面
  • 2022年大厂java高频面试题附带答案解析

    本篇分享的面试题内容主要包括 Java SpringMVC Spring Spring Boot Spring Cloud MyBatis ZooKeeper Dubbo Elasticsearch Redis MySQL RabbitMQ
  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • Java技术栈(跳槽,面试必备)

    Java技术栈 来到北京后 感觉氛围有点浮躁 人员流动性很大 很少有人能沉下心学习 所以最近打算把整理过的知识点拿出来给大家分享下 基础扎实了 无论是工作还是跳槽都很有用 跳槽前将知识点整理成word打印出来 然后背其中的知识点 保证你能面
  • CountDownLatch CyclicBarrier 原理 总结

    参考链接 http ifeve com talk concurrency countdownlatch http www importnew com 15731 html https www cnblogs com nullzx p 527
  • LeetCode (二)找出数组中多于半数的数字

    题目 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数 大于 n 2 的元素 解法 自己的解法 思路 for循环遍历存Map 记录key对应的Count 如果大于半数 返回 package com jzj stu
  • BATJ面试必会之Java IO 篇

    一 概览 二 磁盘操作 三 字节操作 实现文件复制 装饰者模式 四 字符操作 编码与解码 String 的编码方式 Reader 与 Writer 实现逐行输出文本文件的内容 五 对象操作 序列化 Serializable transien
  • Java面试:Java中==与equals的区别

    比较的是两个引用在内存中指向的是不是同一对象 即同一内存空间 也就是说在内存空间中的存储位置是否相同 引用类型 如果两个对象的引用指向同一内存空间 操作符返回true 否则返回flase public class Test public s
  • 面向对象的设计思想

    面向对象的设计思想 OO思想 Object Oriented 1 看到一个需求的时候不应该直接写代码 应该先考虑有哪些类 2 考虑类的时候 类一定是一类事务的描述 不能太局限 3 考虑类的时候需要考虑主要的类 也就是需要和业务 动作 事件紧
  • Java 线程同步 - 7种方式

    为何要使用同步 java允许多线程并发控制 当多个线程同时操作一个可共享的资源变量时 如数据的增删改查 将会导致数据不准确 相互之间产生冲突 因此加入同步锁以避免在该线程没有完成操作之前 被其他线程的调用 从而保证了该变量的唯一性和准确性
  • 华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

    系列文章目录 文章目录 系列文章目录 前言 一 1 汽水瓶 二 明明的随机数 前言 一 1 汽水瓶 某商店规定 三个空汽水瓶可以换一瓶汽水 允许向老板借空汽水瓶 但是必须要归还 小张手上有n个空汽水瓶 她想知道自己最多可以喝到多少瓶汽水 数
  • JVM 内存模型

    JVM 内存模型 1 JVM 内存模型共分为5个区 Java虚拟机栈 本地方法栈 堆 程序计数器 方法区 元空间 2 各个区各自的作用 a 本地方法栈 用于管理本地方法的调用 里面并没有我们写的代码逻辑 其由native修饰 由 C 语言实
  • SSM框架-SpringMVC详解

    springmvc概述 Springmvc是spring框架的一个模块 spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的web框架 表现层的三大任务 URL到controller的映射 http请求参
  • 三面美团被问:MySQL的B+Tree索引到底是咋回事?聚簇索引到底是如何长高的?这不是必过?

    你肯定知道MySQL进行CRUD是在内存中进行的 也就是在Buffer Pool中 然后你也知道了当内存中没有MySQL需要的数据时 MySQL会从Disk中通过IO操作将数据读入内存中 读取的单位呢就是 数据页 一般数据页长下面这样 没错

随机推荐

  • CodeProject - DrawTools(画图工具)

    原作者 Alex Farber 原文 http www codeproject com csharp DrawTools asp 源代码请参见原文 介绍 DrawTools示例告诉你怎么创建一个Windows窗体 来使用鼠标和画图工具在窗体
  • Vue2使用echarts树图(tree)

    Vue3使用echarts树图 tree 本文使用echarts版本 v5 3 3 项目相关依赖版本信息 参考文档 Documentation Apache ECharts 自定义传入初始化数据treeData 效果如下图 安装echart
  • VScode : 过程试图写入的管道不存在

    前言 由于这个问题比较常见 所以想记录一下 以下记录的问题都是我自己遇到的比较多的问题以及解决方案 常见问题和解决方案 问题1 网段不一样 解决方案 通常服务器的网段是内网 自己如果远程连接 需要挂v p n 因此 重新挂一个和服务器网段一
  • go-zero jwt 鉴权快速实战

    前面我们分享了 go zero 的快速实战以及日志组件的剖析 本次我们来实战使用 go zero jwt 鉴权 本次文章主要是分享关于 go zero 中 jwt 的使用方式 会以一个 demo 的方式来进行实战 对于使用 goctl 工具
  • 【QNX】快速入门指南

    目录 1 QNX 快速入门指南 2 系统要求 2 安装 QNX Momentics 开发套件 3 安装 QNX Neutrino 实时操作系统 4 QNX Neutrino 操作系统的联网 1 QNX 快速入门指南 本指南旨在帮助用户安装和
  • 基于24位AD转换模块HX711的重量称量实验(已补充皮重存储,线性温度漂移修正)...

    转载 http www geek workshop com thread 2315 1 1 html 以前在X宝上买过一个称重放大器 180 大洋 原理基本上就是把桥式拉力传感器输出的mV级信号放大到5V供单片机读取 连接实验电路的时候很完
  • 猴子-从零开始学数据分析,什么程度可以找工作?

    转行到数据行业差不多一个月了 才敢来回答这个问题 其中各种心酸 无助真不是能用语言能表达的 下面我尽可能的详细的说说 希望对接下来想转行的朋友有帮助 我是2016年6月毕业的控制工程硕士 就是个不入流的普通二本 学习成绩也不好 糊里糊涂的也
  • 计算机中文件夹怎么上密码,文件夹怎么设置密码,详细教您如何给电脑上文件夹设置密码...

    在平常的工作中 有时候我们为了保证信息的安全性总是喜欢建立一个文件夹然后进行加密 虽然这一操作很容易 但是对于普通用户来说却是不简单 那么文件夹该怎么加密码呢 下面 小编就来跟大家分享文件夹设置密码的操作技巧 众所周知 在工作时 难免会涉及
  • [需求管理-10]:功能规范内容与撰写流程

    目录 第1章 需求规格说明书与功能规范的异同 第2章 功能规范撰写的总体流程 2 1 什么是功能规范撰写的流程 2 2 功能规范撰写流程的职责 2 3 什么时候启动功能规范CFAM撰写流程 2 4 哪些人参与功能规范撰写流程 2 5 项目相
  • Java中有指针么?

    指针的概念对于没有学过C语言的朋友是很陌生的 因为JAVA中没有学过指针 那么什么是指针呢 指针 Pointer 是编程语言中的一个对象 利用地址 它的值直接指向 Pointed to 存在电脑存储器中另一个地方的值 也就是通过地址可以找到
  • 一文清晰讲明白DDD(领域驱动设计)的知识点

    什么是DDD DDD 领域驱动设计 是一种处理高度复杂领域的设计思想 是一种架构设计方法论 是一种设计模式 以高内聚低耦合为目的 把一个复杂的软件应用系统中各个部分进行一个很好的拆解和封装 对软件系统进行模块化的一种思想 DDD不仅可以用于
  • HarmonyOS开发详解(四)——鸿蒙Page Ability功能及UI界面开发详解

    HarmonyOS里面的界面通过Page Ability和Java UI一起来实现 讲述Page Ability就离不开Ability 在HarmonyOS里面把各种具备的能力进行抽象 叫做Ability Ability是程序重要的组成部分
  • 笔记——关于QLabel重写paintEvent有背景图绘制数据无法显示的问题

    一般重写paintEvent时都会调用基类本身的paintEvent来刷新我们的界面 在自定义QLabel时 当想给自定义Label设置背景图时 若将QLabel paintEvent放在代码块末尾 那么会导致绘制数据无法显示 解决方法将其
  • INSERT讲解

    INSERT简介 基本格式 insert into 表名 values 参数 注意 参数必须跟表里的列一一对应 insert into 表名 列明 values 参数 注意 参数必须跟 列明 一一对应 多条插入时 将多个参数插入到表1 in
  • 【FRRouting User Guide】【Basic 】(五)VTY shell

    vtysh为单个组合会话中的所有FRR守护进程提供了一个组合前端 默认情况下 它在生成时启用 但可以通过configure脚本的 disable vtysh选项禁用 vtysh有一个配置文件 vtysh conf文件 该文件的位置不能从 e
  • matlab软件 可扩展性要求,对软件设计可扩展性的思考

    通常设计软件的时候 可扩展性是一个设计的考量点 可扩展性的优点自然很多 如 增加需求的迭代速度 提高维护效率 但是最近在维护系统的过程中 发现系统设计过于复杂 导致学习成本和维护成本剧增 背后的原因是为了增加系统的可扩展性 增加软件的复杂度
  • element Ui 表格内容 自定义数量,超出隐藏...

    在使用table表格时 让单元格内的字数超出时隐藏并 可通过设置宽度 加show overflow tooltip来实现
  • matlab暑期学习笔记(1)——句柄

    matlab中的句柄等价于C语言中的指针 句柄分很多种 函数句柄 图形句柄等等 1 图形句柄 图形句柄就特指这个图形 例如 h plot x y 那么h就相当于这个图形的句柄 设置该图形时 只需要set h 即可 2 函数句柄 matlab
  • 深入浅出RPC框架

    Powered by NEFU AB IN 文章目录 深入浅出RPC框架 青训营 RPC 框架分层设计 远程函数调用 RPC 介绍 名词解释 一次RPC过程 RPC好处和弊端 分层设计 编解码层 协议层 网络通信层 RPC 关键指标分析与企
  • volatile的原理和实现机制 系统级别原理 MESI协议 总结笔记

    https blog csdn net jjavaboy article details 77164474 http www infoq com cn articles ftf java volatile volatile原理 底层是靠一个