Volatile关键字原理
转载请标明: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关键字原理的更多相关文章
- java:volatile关键字原理
volatile说明 在变量中声明后,能够在所有线程中共享改变量.并且volatile关键字能防止指令重排,即程序读取到volatile时,则不会将程序执行顺序修改. 先了解下内存模型 cpu内存模型 ...
- JUC回顾之-volatile的原理和使用
1.计算机内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,在指令的执行过程中,涉及到数据的读取和写入.由于程序在运行的过程中数据是放在"主存"中的, 由于数据 ...
- Java单例模式和volatile关键字
单例模式是最简单的设计模式,实现也非常"简单".一直以为我写没有问题,直到被 Coverity 打脸. 1. 暴露问题 前段时间,有段代码被 Coverity 警告了,简化一下代码 ...
- Java并发——volatile关键字的使用
volatile关键字的使用volatile关键字原理适合使用volatile关键字的情况当且仅当满足以下所有条件时,才==应该==使用volatile关键字:volatile关键字的作用volati ...
- 就是要你懂Java中volatile关键字实现原理
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...
- Java的 volatile关键字的底层实现原理
我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.本文详细解读一下volat ...
- 【转】Java学习---Java中volatile关键字实现原理
[原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...
- volatile关键字的作用、原理
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...
- 面试题:volatile关键字的作用、原理
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例. 而发挥神奇作用的volatile,可以当之无愧的被称为Java ...
- Java中volatile关键字实现原理
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...
随机推荐
- css动画京东小布hover放大
<style> .box { width: 183px; height: 130px; overflow: hidden; border: 1px solid pink; } div im ...
- wap2app下拉刷新
支持全局刷新,支持vue项目 目前支持wap2app,uin-app全局下拉刷新 戳我阅读原文 --转载自微信公众号:酿俗
- 从零开始配置vim(20)——模糊查询
在讲解vim的基础功能的时候,介绍过了vim的各种查询技巧,在同一个文件中进行搜索的话,那些技巧很有用.在多个文件中我们介绍了使用vim自带的 :grep命令进行搜索,使用quickfix 列表进行跳 ...
- 使用C++实现Range序列生成器
在C++编程中,经常需要迭代一系列数字或其他可迭代对象.通常,这需要编写复杂的循环结构,但有一种精妙的方法可以使这一过程变得更加简单和可读.如果你使用过Python语言那么一定对Range语句非常的数 ...
- 万字剖析OpenFeign整合Ribbon实现负载均衡的原理
大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribbon来实现负载均衡的 ...
- 【可观测性系列】 Opentelemetry 介绍
作者简介:大家好,我是蓝胖子 ️博客首页:博客园主页蓝胖子的编程梦 每日一句:人生的烦恼,多在于明白的太多,而做的太少 大家好,我是蓝胖子,随着微服务的流行,服务的可观测性概念被越来越多人提及到,究竟 ...
- 体验 ABP 的功能和服务
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. ABP是一个全栈开发框架,它在企业解决方案的各个方面都有许多构建模块.在前面三章中 ...
- 19.1 DLL基础--《Windows核心编程》
Windows 中最重要的三个DLL是: Kernel32.dll:包含的函数用来管理内存.进程以及线程 User32.dll:包含的函数用来执行和用户界面相关的任务 GDI32.dll:包含的函数用 ...
- Eclipse安装配置、卸载教程(Windows版)
Eclipse是一个开放源代码的集成开发环境(IDE),最初由IBM公司开发,现在由Eclipse基金会负责维护.它是一个跨平台的工具,可以用于开发多种编程语言,如Java.C/C++.Python. ...
- 微信小程序云开发项目-个人待办事项-02今日模块开发
上一篇: 微信小程序云开发项目-个人待办事项-01介绍 https://blog.csdn.net/IndexMan/article/details/124485626 模块开发步骤 本篇介绍今日模块 ...