lock前缀指令干的事。

volatile 修饰的变量在进行写操作时会多出一条如下的汇编指令:

lock addl $0x0,(%esp)

volatile就是靠这个lock前缀指令去实现可见性的,当对volatile修饰的共享变量进行写操作时,lock前缀的指令在多核处理器下会引发两件事情:

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

    为了提高处理的响应速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存中(L1,L2或其他)在进行操作,但是操作完不知道会何时写入到内存中。如果对volatile修饰的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,处理器收到指令都就会立即将缓存行的数据写入到内存中。需要注意的是Lock前缀指令导致在执行指令期间,声言处理的LOCK#信号。在多处理器环境中,LOCK#信号确保在声言信号期间,处理器可以独占任何共享缓存,会使用总线锁(锁住总线,导致其他cpu不能访问总线,总线系统连接者cpu和内存,总线一旦不能访问就意味着其他cpu无法访问内存),但是在最近的处理器中,LOCK#信号一般不锁总线(注意是一般,特殊情况下还是会锁总线,比如数据跨多个缓存行),而是锁缓存,毕竟锁总线开销比较大。对于Intel486和Pentium处理器,在锁操作期间,总是在总线上声言LOCK#信号。但在目前的处理器中,如果访问的内存已经缓存在处理器内部,则不会声言LOCK#信号。相反,他会锁定这块内存区域的缓存并回写到内存,并使用缓存一致性机制来确保修改的原子性,这种操作被称为"缓存锁定",缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。

2.一个处理器的缓存回写到内存会导致其他处理器的缓存无效。

    一个处理器的缓存回写到内存会导致其他处理器的缓存无效。IA-32 处理器和 Iniel 64 处理器使用 MESI (修改、独占、共享、无效)控制协议去维护内部缓存和其他处理器缓存的一致性。在多核处理器系统中进行操作的时候, IA-32和Intel64处理器能嗅探其他处理器访问系统内存和它们的内部缓存。处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。例如,在 Pentium 和 P6famaly 处理器中,如果通过嗅探一个处理器来检测其他处理器打算写内存地址,而这个地址当前处干共享状态,那么正在嗅探的处理器将使它的缓存行无效,在下次访问相同内存地址时,强制执行缓存行填充

总结

1.处理器在执行lock指令时会立即将缓存中的数据同步到内存,同步时选择使用总线锁定或缓存锁定(通过缓存一致性协议实现,例如mesi协议)来保证修改操作的原子性,然后依靠缓存一致性来确保缓存中的值相同。

2.为什么有了MESI协议还需要volatile?MESI 原本是强一致性的,经过性能优化后,弱化成了最终一致性。在某些中间状态下,多个 CPU 之间的数据并不一致。同时也可能会发生乱序执行的情况,也就是重排序,volatile可以防止重排序;MESI协议数据修改完成后会先放入Load Buffer并不会直接放入内存,volatile修饰的变量在进行写操作完成后会直接同步到内存中。

java volatile是如何保证可见性的?的更多相关文章

  1. 在JAVA中ArrayList如何保证线程安全

    [b]保证线程安全的三种方法:[/b]不要跨线程访问共享变量使共享变量是final类型的将共享变量的操作加上同步一开始就将类设计成线程安全的, 比在后期重新修复它,更容易.编写多线程程序, 首先保证它 ...

  2. 从根源上解析 Java volatile 关键字的实现

    1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析Volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程 ...

  3. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  4. Java volatile详解

    转自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受 ...

  5. JAVA volatile 解析

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  6. java volatile 关键字(转)

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  7. Java volatile关键字小结

    public class Test { public static void main(String[] args){ } } /* 12.3 Java内存模型 Java内存模型定义了线程与主内存之间 ...

  8. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  9. Volatile 只保证可见性,并不保证原子性

    [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/52525724   在说明Java多线程内存可见性之前,先来简单了解一下J ...

  10. Java Volatile相关文章目录

    参考资料: http://www.google.com/cse?sa.x=0&sa.y=0&cx=010284515138798138769%3Aajbqkpwaapm&ie= ...

随机推荐

  1. Html 设置标题栏顶部固定

    如何设置标题栏一直置顶固定显示? 只需要给标题栏所在的容器,以下设置:   position: fixed;   top: 0px;   left: 0px;   width: 100%; 位置固定在 ...

  2. JS 打开本地应用软件

    我们有遇到可以直接打开QQ的跳转链接,也有遇到过直接启动office打开文档. 具体是如何操作的呢? 添加注册表项 首先需要在注册表中添加应用软件的启动地址,操作方式如下 在HKEY_CLASSES_ ...

  3. Python 持久化-文件

    文件 长久保存信息的一种数据信息集合 常用操作 打开关闭(文件一旦打开,需要关闭操作) 读写内容 查找 open函数 open函数负责打开文件,带有很多参数 第一个参数: 必须有,文件的路径和名称 m ...

  4. Vite-WeGPT聊天AI实例|vue3+pinia仿ChatGPT聊天界面

    基于vue3.x+vite4+pinia2仿chatgpt聊天模拟实例Vue3-WeGPT. 基于Vite4.x+Vue3+Pinia2+VEPlus+Vue3-Markdown等技术实现仿ChatG ...

  5. 2021-12-22:回文子串。 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。

    2021-12-22:回文子串. 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一个序列. ...

  6. django--循环调用的解决办法

    不要导入该APP的包,而是加上双引号写入"App.xxx"

  7. 限速神器RateLimiter源码解析

    作者:京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流: •场景一.高并发的用户端场景. 尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统 ...

  8. 详解JS的Object.assign()

    Object.assign() 通过复制一个或多个对象来创建一个新的对象. 语法 Object.assign(target, ...sources) 描述 如果目标对象中的属性具有相同的键,则属性将被 ...

  9. 「高频面试题」Redis的持久化方式有哪些?

    RDB RDB(Redis DataBase)持久化是把当前Redis中全部数据生成快照保存在硬盘上.RDB持久化可以手动触发,也可以自动触发.save和bgsave命令都可以手动触发RDB持久化.除 ...

  10. HDU 6981.Rise in Price (Beam Search 贪心)

    by 0htoAi,写于2021.8.14 Problem Description There are n×n cells on a grid, the top-left cell is at (1, ...