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. JS中的Map、Set、WeakMap和WeakSet

    在JavaScript中,Map.Set.WeakMap和WeakSet是四个不同的数据结构,它们都有不同的特点和用途: 1. Map :Map是一种键值对的集合,其中的键和值可以是任意类型的.与对象 ...

  2. [C++基础入门] 4、 程序流程结构

    文章目录 4 程序流程结构 4.1 选择结构 4.1.1 if语句 4.1.2 三目运算符 4.1.3 switch语句 4.2 循环结构 4.2.1 while循环语句 4.2.2 do...whi ...

  3. Vue实战案例

    Vue项目案例 结合之前学习的 vue.js.脚手架.vuex.vue-router.axios.elementui 等知识点,来开发前端项目案例(仅前端不含后端). 1.项目搭建 其实就是将我们项目 ...

  4. 继承 extends

    首先是基础的继承关系,用extend就可以继承. 再者是继承的东西,包括:变量(也包括类变量).全部非私有的属性和方法(除了父类的构造方法) 注:构造方法 class C{ public C() { ...

  5. Netty服务端开发及性能优化

    作者:京东物流 王奕龙 Netty是一个异步基于事件驱动的高性能网络通信框架,可以看做是对NIO和BIO的封装,并提供了简单易用的API.Handler和工具类等,用以快速开发高性能.高可靠性的网络服 ...

  6. 高精度地形DEM数据下载(NASA数据 12.5米分辨率)

    本文介绍从NASA阿拉斯加卫星设备处网站下载高精度DEM数据,下载的数据精度是12.5米分辨率. 目前国内大部分可以下载的dem数据都是30米或90米分辨率的,对于更高精度的数据要不就是需要付费下载, ...

  7. Prism Sample 7 Module xaml

    这一节使用xaml标记甚为不解. 本节注册module 的方式同directory一节很类似.在那一节中,用工厂方法创建一模块目录: protected override IModuleCatalog ...

  8. 解决pod健康检查问题

    解决pod健康检查问题 引自:Solving the mystery of pods health checks failures in Kubernetes.原文中的某些描述并不清晰,本文作了调整. ...

  9. 2022-09-23:整数数组 stations 表示 水平数轴 上各个加油站的位置。给你一个整数 k 。 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数

    2022-09-23:整数数组 stations 表示 水平数轴 上各个加油站的位置.给你一个整数 k . 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数 ...

  10. 2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

    2021-08-16:回文对.给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串. 福大大 答案20 ...