volatile 与处理器的嗅探技术

2023-11-16

在《java并发编程的艺术》这本书中,关于volatile的内存原理本质的描述如下:

有volatile变量修饰共享变量在编译器编译后,后多出一个“lock” 来(lock前缀指令相当于一个内存屏障,会强制将对缓存的修改操作写入主内存),该字符在多核处理器下回引发两个事件:

1.将当前处理器缓存行的数据写回系统内存;

2.这个写会内存的操作会使得其他处理器里缓存的该内存地址的数据无效。

在该书籍第三章中的描述如下:

1.当写一个volatile变量时,JMM(java共享内存模型)会把该线程对应的本地内存中的共享变量值刷新到主内存;

2.当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来从主内存中读取共享变量。

在第三章中并未深入讲述JMM时如何将该线程对应的本地内存置为无效的,在第二章中,也只是一笔带过有如下描述:

1.每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态, 当处理器对这个数据进行修改操作的时候,会重新从系统内存中吧数据读到处理器缓存行里。

2.处理器使用嗅探技术保证它的内部缓存,系统内存和其他处理器的缓存在总线上保持一致。

书中并没有明确说明,处理器将会在何时触发“嗅探”这个操作,但我在基于书本做出以下猜测:

volatile修饰的共享变量的写操作会触发“嗅探”,让处理器本地缓存中的volatile变量失效;

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

volatile 与处理器的嗅探技术 的相关文章

  • 病毒或机器故障导致“无法创建Java虚拟机”?

    我用的是双核XP机安装了 4GB 内存 但仅2 5GB由于 32 位事实 由操作系统报告 我正在积极修改旧的 JAVA 应用程序至少一个月 使用最新的Eclipse 编辑 构建和运行 和Ant 另一种构建和运行的方式 在里面Eclipse运
  • 内存中的方法表示是什么?

    在思考一下 Java C 编程时 我想知道属于对象的方法如何在内存中表示 以及这一事实如何涉及多线程 是为内存中的每个对象单独实例化一个方法还是执行 同一类型的所有对象共享该方法的一个实例 如果是后者 执行线程如何知道哪个对象是 要使用的属
  • 是否可以使 java.lang.invoke.MethodHandle 与直接调用一样快?

    我正在比较性能MethodHandle invoke以及直接静态方法调用 这是静态方法 public class IntSum public static int sum int a int b return a b 这是我的基准 Stat
  • Cassandra DB 中的日期插入:重要的 1 小时轮班问题(后续)

    这是这个的后续其他原帖 https stackoverflow com questions 23080188 date insertion in cassandra db non trivial 1h shift issue 2308355
  • 将 JVM 字节码往返于文本表示的故障安全方法

    我正在寻找一种在 JVM 类文件和文本表示之间往返的故障安全方法 一项严格的要求是 只要文本表示形式保持不变 生成的往返 JVM 类文件在功能上与原始 JVM 类文件完全相同 此外 文本表示必须是人类可读和可编辑的 应该可以对文本表示进行小
  • 使用 + 符号连接字符串

    今天我在读书Antonio 关于 toString 性能的博客 https antoniogoncalves org 2015 06 30 who cares about tostring performance 还有一段话 昨天曾经被认为
  • 如何使 volatile count++ 操作成为线程安全的

    我一直在经历 JCIP 作者说 线程限制的一个特殊情况适用于易失性变量 只要确保 volatable 变量仅从单个线程写入 对共享 volatile 变量执行读取 修改 写入操作是安全的 例如 count 被认为是一个复合操作 读取值 加一
  • 当 Java 中的集合超出容量时会发生什么?

    我有一个服务 它将所有对其进行的调用暂存在内存中 因为我们不想丢失数据 同时我们需要该服务因任何外部依赖项 例如数据库 而失败 然后 这些分阶段的调用会在后台例行接收和处理 如果出于任何原因 如果调用太多并且内存不足 我们就需要警惕 所以
  • 我的代码中出现内存不足异常

    作为 Oracle 数据库压力测试的一部分 我正在长时间运行代码并使用 java 版本 1 4 2 简而言之 我正在做的是 while true Allocating some memory as a blob byte data new
  • HotSpot使用的Mark-Compact算法是什么?

    当阅读 Mark Compact 章节时垃圾收集手册 https rads stackoverflow com amzn click com 1420082795 提出了一系列替代方案 但其中大多数看起来很旧 理论上 例如 2 指压缩和 L
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher
  • Java GuardedString - 用于加密的随机密钥是否存储在 Java 堆内存中?如果不是,那么密钥保存在哪里?

    Oracle 的 org identityconnectors common security GuardedString 要转换为 GuardedString 的原始数据需要由 EncryptorImpl class 随机生成的加密密钥
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • Scala 为了在 JVM 上运行做出了哪些妥协?

    Scala 是一种很棒的语言 但我想知道如果它有自己的运行时 如何改进 IE 由于 JVM 的选择 做出了哪些设计选择 我所知道的两个最重要的妥协是 类型擦除 http java sun com docs books tutorial ja

随机推荐

  • Object的方法(对象的遍历,合并等)。

    1 构造函数 Object 创建一个新的 Object 对象 该对象将会包裹 wrapper 传入的参数 2 静态方法 Object assign 通过复制一个或多个对象来创建一个新的对象 Object create 使用指定的原型对象和属
  • 5个高清视频素材网站,免费下载~

    免费高清视频素材网站 这几个你一定要知道 建议收藏 1 菜鸟图库 https www sucai999 com video html v NTYxMjky 菜鸟图库网素材非常丰富 网站主要还是以设计类素材为主 高清视频素材也很多 像风景 植
  • Prometheus和Grafana

    1 首先简单介绍Prometheus和Grafana Prometheus是由SoundCloud开发的开源监控报警系统和时间序列数据库 TSDB 它是一个监控采集与数据存储框架 监控服务器端 具体采集什么数据依赖于Exporter 监控客
  • TrueCrypt简介、在VS2008下的编译过程

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 编译过程中用到的工具下载地址 http download csdn net detail chenyujing1234 4448383 资
  • JSP学习之初识JSP(实现简单的计算器)

    IE浏览器 gt Tomcat gt 数据库 访问JSP的过程 如果是第一次访问 jsp文件被服务器翻译成一个对应的java文件 Servlet 然后 再被编译成一个 class文件并装载到服务器的内存中 如果以后访问JSP 那就直接调用内
  • vue + ant design vue 项目打包优化

    废话不多说 直接上代码 main js 注释掉 vue 和 antdv Vue use antd 这句话一定不能删除 antd 变量虽然没有定义 但是 是cdn资源里面的模块 一定要引入进来 如果提示 antd 未定义可能是 cdn 资源问
  • CSS基础学习--27 常使用的属性

    一 文本效果 属性 描述 CSS hanging punctuation 规定标点字符是否位于线框之外 3 punctuation trim 规定是否对标点字符进行修剪 3 text align last 设置如何对齐最后一行或紧挨着强制换
  • 应用层与驱动层通信DeviceIoControl

    驱动层与应用层通信是通过DeviceIoControl 符号定义 define DEVICE NAME L Device myDriver Driver Name define SYMBOLIC LINK NAME L DosDevices
  • vue实现给当前元素添加样式,其他元素无样式

    vue实现给当前元素添加样式 其他元素无样式 今天做项目的时候遇到 给当前元素绑定样式 原来使用原生js写点亮盒子的时候都是利用for循环 循环元素列表 在利用this来绑定当前元素 给当前元素添加类名或类样式 当然在添加类样式前 还要将所
  • 把iconfront的资源放cdn访问_详解mpvue小程序中怎么引入iconfont字体图标

    前言 iconfont阿里巴巴矢量图标库是我很喜欢的一个网站 可以下载 在线编辑 上传自己需要的矢量图标 也支持团队协作 那么在mpvue项目中如何引入呢 将图标加入购物车 搜索关键词可以是中文也可以是英文 下载素材 点击网站右上角的购物车
  • C/C++中#pragma once的使用

    在C C 中 为了避免同一个文件被include多次 有两种方式 一种是 ifndef方式 一种是 pragma once方式 在头文件的最开始加入 ifndef SOME UNIQUE NAME HERE define SOME UNIQ
  • 一本二本三本有什么区别

    一本二本三本有什么区别 很多家长和考生问老师 一本二本三本到到底什么区别于老师给大家普及一下 其实一本 二本 三本 无论是学历性质还是学历层次都是一样的 毕业证书除了毕业学校的公章和校长的签章 其他没有任何区别 都是中华人民共和国教育部监制
  • tensorflow中,session.run()与tensor.eval()的区别

    session run 与tensor eval 都是tensorflow用来计算图的一一部分的方法 那么这两种方式有什么异同呢 假设有一个tensor a 在使用a eval时 等价于 sess run 其中 sess是当前默认会话 这这
  • GitHub 开源推荐

    说起 Web 开发 大多数人会想到 Java Python Golang 因为它们的主流 Web 框架有很多 Java 有非常知名的 Spring 全家桶 Python 有大而全的 Django 小而精的 Flask 高性能的 Tornad
  • 最新SQL注入漏洞原理及与MySQL相关的知识点

    点击星标 即时接收最新推文 本文选自 web安全攻防渗透测试实战指南 第2版 点击图片五折购书 SQL注入漏洞简介 SQL注入是指Web应用程序对用户输入数据的合法性没有判断 前端传入后端的参数是攻击者可控的 并且参数被带入数据库查询 攻击
  • 关于linux内核编译时出现错误 objtool: missing symbol table的解决方法

    在内核编译时出现了objtool missing symbol table的错误导致编译失败上网找了一圈之后找到下面的方法 新建一个文件thunkpatch patch填入 tools objtool elf c 7 1 file chan
  • 西门子S7-200 SMART编程软件下载

    概述 西门子S7 200 SMART是一款入门级且非常好用的PLC 相比较于欧姆龙 三菱等同级别PLC SMART的编程软件架构更合理且逻辑性强 且官方一直在持续更新 截止于2021年8月 官方最新版编程软件 STEP7 MicroWIN
  • C#读取文件时中文显示问号

    StreamReader reader new StreamReader test txt Encoding Default string str reader ReadToEnd Console WriteLine str reader
  • 音视频大牛雷霄骅

    https blog csdn net leixiaohua1020 https www zhihu com question 49211380 https www bilibili com video av9927626 share so
  • volatile 与处理器的嗅探技术

    在 java并发编程的艺术 这本书中 关于volatile的内存原理本质的描述如下 有volatile变量修饰共享变量在编译器编译后 后多出一个 lock 来 lock前缀指令相当于一个内存屏障 会强制将对缓存的修改操作写入主内存 该字符在