每日一个知识点系列的目的是针对某一个知识点进行概括性总结,可在一分钟内完成知识点的阅读理解,此处不涉及详细的原理性解读。

img

看图说话

关键点1: 总线嗅探器(MESI 缓存一致性原理 )

关键点2: 总线锁、缓存锁,为了解决并发问题,会在内存区域的值加锁(内存锁),是在store 之前会给总线内的值加一个锁,write 完成后在解锁(这里大部分是缓存行锁的,总线锁看情况)。

关键点3:

就是为了使一个CPU上运行的线程能够读取到另外一个CPU线程的共享变量更新。这个CPU必须先根据无效化队列中存储的消息,删除相应高速缓存内的数据副本,从而在其他CPU更新共享变量时能通过缓存一致性协议同步到该CPU的高速缓存中。内存屏障中的加载屏障 (Load Barrier)就是用来解决这个问题的。Load Barrier会根据会根据无效化队列内容的内存地址,将其他CPU上使用了该缓存的高速缓存中对应的数据状态标记为I,从而使用该CPU后续针对这个的读操作时必须先发送Read消息,以将其他处理器对相关共享变量所做的更新同步到该处理器的高速缓存中。

总结:

当修改了增加volatile 的变量时,会马上将变量值写回到主内存中,这时会在store 前对主内存的这个变量加锁,在store 通过总线的时候触发MESI缓存一致性协议,通过总线嗅探器将其他cpu工作内存中的此变量置为无效状态(涉及内存屏障)。当次cpu 完成变量的write 操作时,在对变量进行解锁。

书籍:

推荐一本非常好的关于这方面的书籍,一本书帮你扫平多线程内容,扫码回复暗号获取:01

往期推荐

(最新 9000字) Spring Boot 配置特性解析

Spring Boot 知识清单(一)SpringApplication

何时用多线程?多线程需要加锁吗?线程数多少最合理?

高并发系统,你需要知道的指标(RT...)

来,我们在重新说下,线程状态?

每日一个知识点系列:volatile的可见性原理的更多相关文章

  1. 每日一个知识点:Volatile 和 CAS 的弊端之总线风暴

    每日一个知识点系列的目的是针对某一个知识点进行概括性总结,可在一分钟内完成知识点的阅读理解,此处不涉及详细的原理性解读. 一.什么是总线风暴 总线风暴,听着真是一个帅气的词语,但如果发生在你的系统上那 ...

  2. 一文搞懂volatile的可见性原理

    说volatile之前,了解JMM(Java内存模型)有助于我们理解和描述volatile关键字.JMM是Java虚拟机所定义的一种抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让Java程序在 ...

  3. 一篇夯实一个知识点系列--python生成

    写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...

  4. 一篇夯实一个知识点系列--python装饰器

    写在前面 本系列目的:希望可以通过一篇文章,不望鞭辟入里,但求在工程应用中得心应手. 装饰器模式是鼎鼎大名的23种设计模式之一.装饰器模式可以在不改变原有代码结构的情况下,扩展代码功能. Python ...

  5. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  6. Java并发编程知识点总结Volatile、Synchronized、Lock实现原理

    Volatile关键字及其实现原理 在多线程并发编程中,Volatile可以理解为轻量级的Synchronized,用volatile关键字声明的变量,叫做共享变量,其保证了变量的“可见性”以及“有序 ...

  7. 深入分析Volatile的实现原理(转)

    引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当 ...

  8. 聊聊并发(一)深入分析Volatile的实现原理

    本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/ftf-java-volatile 引言 在多线程并发编程中synchronized和Vola ...

  9. [Java并发编程(五)] Java volatile 的实现原理

    [Java并发编程(五)] Java volatile 的实现原理 简介 在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 sync ...

随机推荐

  1. Java14版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  2. 「Netty实战 02」手把手教你实现自己的第一个 Netty 应用!新手也能搞懂!

    大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 很多小伙伴搞不清楚为啥要学习 Netty ,今天这篇文章开始之前,简单说一下自己的看法: @ 目录 服务端 创建服务端 自定义服务端 Cha ...

  3. SpringBoot系列——MyBatis-Plus整合封装

    前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...

  4. 最强云硬盘来了,让AI模型迭代从1周缩短到1天

    摘要:华为云擎天架构+ Flash-Native存储引擎+低时延CurreNET,数据存储和处理还有啥担心的? 虽然我们已经进入大数据时代,但多数企业数据利用率只有10%,数据的价值没有得到充分释放. ...

  5. Python全局变量的简单使用

    对Pyhon实现静态变量全局变量的方法详解 python不能像C++一样直接定义一个static变量或者通过extern来导入别的库的变量而实现数据共享,但是python的思想是通过模块化来解决这个问 ...

  6. sourse insight总是代码一写长了,就自动换行

    sourse insight总是代码一写长了,就自动换行. Document Options里面Word Wrap选项不勾选.

  7. WebStorm下ReactNative代码提示设置

    ReactNative 代码智能提醒  (Webstrom live template) https://github.com/virtoolswebplayer/ReactNative-LiveTe ...

  8. Python自动化测试入门科技树

    Python基础: 入门语法和数据类型: 编码环境安装基本语法 常用数据类型 常用运算符 Llist.Tuple.Dict.if&for.while Python进阶: 函数: 语法 内置函数 ...

  9. 非旋Treap——fhq treap

    https://www.luogu.org/problemnew/show/P3369 知识点:1.拆分split,合并merge 2.split,merge要点:通过传址调用来简便代码 3.记得ro ...

  10. mysql jdbc连接时的小问题java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    这次重新修改老程序时出现了上面的错误,排查过后最终找到问题所在:root帐户默认不开放远程访问权限,所以需要修改一下相关权限. 打开MySQL目录下的my.ini文件(win10默认安装在C:\Pro ...