首页 > 其他分享 >Volatile关键字原理

Volatile关键字原理

时间:2024-03-03 14:02:33浏览次数:26  
标签:缓存 变量 关键字 副本 线程 内存 原理 Volatile 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,volatile
From: https://www.cnblogs.com/tangZH/p/15113505.html

相关文章

  • Choreographer原理
    Android系统在VSYNC信号的指引下,有条不紊地进行者每一帧的渲染、合成操作,使我们可以享受稳定帧率的画面。引入VSYNC之前的Android版本,渲染一帧相关的Message,中间是没有间隔的,上一帧绘制完,下一帧的Message紧接着就开始被处理。这样的问题就是,帧率不稳定,可能高也可能低,不......
  • 《大型网站技术架构:核心原理与案例分析》读后感
    《大型网站技术架构:核心原理与案例分析》这本书,对我而言,不仅仅是一本介绍技术架构的专著,它更是一次深入探索互联网技术奥秘的精神之旅。作者李智慧以其丰富的行业经验和深厚的技术底蕴,为我们揭开了大型网站背后复杂架构的神秘面纱。在阅读第一章后,我被作者系统化、层次分明的叙述......
  • ChatGPT的工作原理
    ChatGPT是美国OpenAI研发的聊天机器人程序,2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言来进行对话。原理ChatGPT是一种基于人工智能技术的自然语言生成模型,它能够从大量的数据和历史对话中学习,并生成与人类语言相似的输出......
  • C++类开发的第六篇(虚拟继承实现原理和cl命令的使用的bug修复)
    Class_memory接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。使用clcl是MicrosoftVisualStudio中的C/C++编译器命令。通过在命令行中键入cl命令,可以调用VisualStudio的编译器进行编译操作。cl命令提供了各种选项和参数,用于指定源......
  • 【Spring AOP】SpringAOP配置过程——基于XML&&基于注解 && Spring AOP实现原理
    概念SpringAOP-AspectOrientedProgramming面向切面编程AOP的做法是将通用、与业务无关的功能抽象封装为切面类切面可配置在目标方法的执行前、后运行,真正做到即插即用可以在不修改源码的情况下对程序进行扩展AOP配置过程——基于XML配置0.添加依赖创建配置文件......
  • Kafka 集群工作原理
    Broker集群工作原理broker启动后,会向zookeeper注册,并记录在Kafka配置节点下的/brokers/ids节点下,之后抢占/controller节点,率先注册的节点的Controller就会负责Leader的选举选举节点会监听/brokers/ids节点的变化,之后根据选举规则选举出Leader,并将Leader信......
  • 简单实现new关键字,及为什么当result为对象则返回这个对象?
    下面是一个简单的JavaScript代码示例,演示了如何手动实现new关键字的功能:functionmyNew(constructor,...args){//创建一个新对象,该对象继承自构造函数的原型varinstance=Object.create(constructor.prototype);//在新对象上调用构造函数,并传入参数var......
  • JAVA基础:引用类型参数传递的相关案例(数组的传递) 方法重载 return关键字
    packagecom.itheima.Method;publicclassMethod6{publicstaticvoidmain(String[]args){int[]arrs=newint[]{2,5,6,4};printArray(arrs);}publicstaticvoidprintArray(int[]arr){if(arr!=null){System.out......
  • JUC系列之(二)volatile关键字
    volatile关键字-内存可见性引出内存可见性问题的示例:packagecom.atguigu.juc;publicclassTestVolatile{publicstaticvoidmain(String[]args){//线程threadDemo修改共享变量的值ThreadDemothreadDemo=newThreadDemo();newThrea......
  • Vue源码解读:响应式原理
    Vue一大特点就是数据响应式,数据的变化会作用于视图而不用进行DOM操作。原理上来讲,是利用了Object.defifineProperty(),通过定义对象属性setter方法拦截对象属性的变更,从而将属性值的变化转换为视图的变化。在Vue初始化时,会调用initState,它会初始化props,methods,data,......