转载请标明:https://www.cnblogs.com/tangZH/p/15113505.html

一、如果一个变量被volatile关键字修饰,那么所有线程都是可见的。所谓可见就是,当一条线程修改了这个变量值,新值对于其他线程来时是立即可见的; 而普通变量不能做到这一点。

1、现在计算机缓存架构:

CPU与内存之间存在缓存。

2、Java内存模型(JMM:java memory model)。

这里的主内存再java中相当于堆。

在不同线程中操作同一个变量,实际上操作的是各自工作内存中的一个副本。

3、JMM的8大原子操作:

4、过程:

当线程1需要用到变量a的时候,会通过read操作将a读入临时区,然后再通过load操作载入到变量副本中。

需要用这个变量的话就用use操作。

当线程2需要用到这个变量的时候也是一样的过程。

如果变量没有加volatile,那么两个线程用到的变量实际上是不一样的。

加上volatile之后:

会强制将缓存刷新到主内.会激活总线嗅探器。当我们改变该变量在副本里面的值后写回主内存时,总线监听到就会去通知其余线程将该变量的副本移除,然后再改变主内存中的值。这样当其他线程再次用到该变量的时候就会重新从主内存里面拿了。

总线嗅探器机制也被叫做MESI缓存一致性协议。

二、Volatile能够禁止指令重排。

1、先看对象的生成过程,底层的指令如下:

(1)、new 一个obj,此时内存里面的初始值为0.

(2)、再栈里面生成一个引用。

(3)、执行构造方法,将值改变。

(4)、将引用指向内存。

而编译器会进行优化,编译器优化是指,在不改变原来语义的情况下,通过调整语句顺序,来让程序运行的更快。比如将(3)、(4)交换顺序不会有什么影响(单线程情况下)。

具体例子看:

单例模式的双重检测

Volatile关键字原理的更多相关文章

  1. java:volatile关键字原理

    volatile说明 在变量中声明后,能够在所有线程中共享改变量.并且volatile关键字能防止指令重排,即程序读取到volatile时,则不会将程序执行顺序修改. 先了解下内存模型 cpu内存模型 ...

  2. JUC回顾之-volatile的原理和使用

    1.计算机内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,在指令的执行过程中,涉及到数据的读取和写入.由于程序在运行的过程中数据是放在"主存"中的, 由于数据 ...

  3. Java单例模式和volatile关键字

    单例模式是最简单的设计模式,实现也非常"简单".一直以为我写没有问题,直到被 Coverity 打脸. 1. 暴露问题 前段时间,有段代码被 Coverity 警告了,简化一下代码 ...

  4. Java并发——volatile关键字的使用

    volatile关键字的使用volatile关键字原理适合使用volatile关键字的情况当且仅当满足以下所有条件时,才==应该==使用volatile关键字:volatile关键字的作用volati ...

  5. 就是要你懂Java中volatile关键字实现原理

    原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...

  6. Java的 volatile关键字的底层实现原理

    我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.本文详细解读一下volat ...

  7. 【转】Java学习---Java中volatile关键字实现原理

    [原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...

  8. volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...

  9. 面试题:volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例. 而发挥神奇作用的volatile,可以当之无愧的被称为Java ...

  10. Java中volatile关键字实现原理

    原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...

随机推荐

  1. element-ui中Select 选择器去除点击时的淡蓝色边框

    <el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...

  2. ClickHouse(06)ClickHouse建表语句DDL详细解析

    目录 当前服务器上创建表(单节点) 语法形式 使用显式架构 从相同结构的表复制创建 从表函数创建 从选择查询创建 分布式集群创建表 临时表 分区表 创建表语句关键字解析 空值或非空修饰符 默认值表达式 ...

  3. Fabric网络升级(一)

    原文来自这里. 本章节主要介绍如何从之前的版本或其他长期支持版本升级至最新版. 从2.1升级到2.2 Fabric v2.1和v2.2都是稳定版,以bug修复和其它形式的代码加固位置.因此,升级不需要 ...

  4. uni-app 实现下拉刷新功能

    我们在运用uni-app开发小程序或h5时,常常需要页面实现下拉刷新功能. 在 js 中定义 onPullDownRefresh 处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事 ...

  5. 在mac中双击执行python

    执行python脚本 mac有内置的python,但还是建议你自己安装一个python,如果没有卸载mac自带的python2.7,当你需要使用python3执行脚本时,python命令需要改为pyt ...

  6. 【构建docker镜像之插件篇】使用插件实战演示:docker-maven-plugin和jib-maven-plugin

    1.说明: docker容器化部署是非常流行的,Java应用如果要运行在docker环境,就要制作包含该应用的docker镜像,可以手动使用dockerfile和docker-compose制作镜像, ...

  7. 【2】Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法!

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  8. Django后台输出原生SQL语句

    如果需要打印orm翻译后的原生sql语句,只需要在setting最后加上下面代码就行. 1 LOGGING = { 2 'version': 1, 3 'disable_existing_logger ...

  9. Mysql切割字符串

    我们常常会遇到需要处理字段中字符串的需求,包括切割.拼接以及搜索等等,在这里介绍几个常用的切割字符串的函数,首先我们在表格中加入我们的实验字段值:https://www.cnblogs.com/Yao ...

  10. 探索C语言的数据类型:解密编程世界的核心秘密

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 常量与变量 1.1 常量 (1) 常量的概念 常量顾名思义就是无法改变的量,比如一周 ...