volatile,内存屏障

news2024/11/16 18:08:40

volatile的特性

可见性: 对于其他线程是可见,假设线程1修改了volatile修饰的变量,那么线程2是可见的,并且是线程安全的

重排序: 由于CPU执行的时候,指令在后面的会先执行,在指令层级的时候

我们晓得volatile的特性后,我们就要去volatile是如何实现的,这个很重要!!!

其实是通过内存屏障去实现的.

volatile的实现有很多层,我这里就简单说下

  • JVM

  • 汇编层

  • CPU层

由于设计到的知识点偏多,后面的我简单介绍下,大家明白原理就行

JVM层

在JVM层,要求虚拟机实现不同的内存屏障,如以下

  • LoadLoad屏障:举例语句是Load1; LoadLoad; Load2 (这句里面的LoadLoad里面的第一个Load对应Load1加载代码,然后LoadLoad里面的第二个Load对应Load2加载代码),此时的意思就是,在Load2及后续读取操作从内存读取数据到CPU前,保证Load1从主内存里要读取的数据读取完毕。

  • StoreStore屏障:举例语句是 Store1; StoreStore; Store2 (这句里面的StoreStore里面的第一个Store对应Store1存储代码,然后StoreStore里面的第二个Store对应Store2存储代码)。此时的意思就是在Store2及后续写入操作执行前,保证Store1的写入操作已经把数据写入到主内存里面,确认Store1的写入操作对其它处理器可见。

  • LoadStore屏障:举例语句是 Load1; LoadStore; Store2 (这句里面的LoadStore里面的Load对应Load1加载代码,然后LoadStore里面的Store对应Store2存储代码),此时的意思就是在Store2及后续代码写入操作执行前,保证Load1从主内存里要读取的数据读取完毕。

  • StoreLoad屏障:举例语句是 Store1; StoreLoad; Load2 (这句里面的StoreLoad里面的Store对应Store1存储代码,然后StoreLoad里面的Load对应Load2加载代码),在Load2及后续读取操作从内存读取数据到CPU前,保证Store1的写入操作已经把数据写入到主内存里,确认Store1的写入操作对其它处理器可见。

这里是JVM要求虚拟机实现(抄的别人的),那么JVM层是如何实现的呢

汇编层(这里可能是废话,但是看看还是值得)

X86指令

  • sfence(写屏障): 在sfence指令的写操作当必须在sfence指令后写操作之前完成

  • fence(读屏障): 在ifence指令之前的读操作当必须在ifence指令前读操作完成.

  • mfence(全屏障): 在mefence指令前的读写操作当必须在mfence指令的读操作完成。

  • lock: CPU层级的锁,锁住地址总线,只允许当前CPU才能去访问内存

这里是了解下就可以,不用去记下来.

CPU层

虚拟机在真正实现内存屏障,是lock指令去实现, lock 锁住的什么呢, 锁住的地址总线,没有去用CPU自带的屏障, 这里我猜测可能这些屏障底层也是用的lock,猜测哈

大概的图就是这个样子, 也就是说 这里的JVM 虚拟机实现的内存屏障,实际上是靠锁住地址总线来实现的,那么我的多线程就变成了单线程,性能降低了, 但是这里不用线程上下文切换,还是比较好。

我是如何得知这里是用的lock呢,我是把执行的代码汇编给打印出来了

源码

汇编

lock addl ... 后面的指令,实际上是往寄存器上加了一个0,实际上是一个空操作。

总结

volatile的内存屏障,实际上是通过汇编的lock来执行,lock 锁住了内存地址总线.

这个是我自己的理解,如果有不对的地方,请指出来,我做修改.

PS 今天我去面试,很久没看的东西,突然被问起来了, 关键第二天还又被问到了, 还是同一个面试官。我心态有点炸裂,回来就马上看了。

希望朋友看了这篇文章,能自己明白volatile,在面试的时候有更好的发挥, 后续我会写synchronized, 不能偷懒了。

打广告

另外给自己打个广告,如果有重庆小伙伴需要招java的,可以联系我, 我微信290857007

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金三银四面试必备的软件测试八股文,看完拿捏面试官

1、问:你在测试中发现了一个 bug,但是开发经理认为这不是一个 bug,你应该怎样解决?首先,将问题提交到缺陷管理库里面进行备案。然后,要获取判断的依据和标准: 根据需求说明书、产品说明、设计文…

蓝屏怎么办电脑蓝屏怎么办?蓝屏问题详细分析

蓝屏怎么办电脑蓝屏怎么办?最近很多小伙伴在咨询这个问题,其实电脑蓝屏了进不去,我们可以重新启动电脑,如果进入系统后还是直接蓝屏,那么你可以尝试一下,关机重启,然后在进入系统的时候&#xf…

路肩石水渠机在施工公路项目中工艺特点的匹配

新建公路路肩项目在目前公路项目中的技术手段和实现方式,大多数依靠机械设备来机械来进行,还有一部分通过人工传统的预制作业和安装模式来进行,两种工艺特点的对比来说对于补充完善建设手段和效果实现有很重要的意义. 其中采用了机械设备进行一次成型制作的过程,按照设计需求匹…

useRef 几种使用场景

图修改自 dev.to Demystifying React Hooks: useRef useRef神奇的地方除了可以在不重新渲染的状态下更有价值,也可以直接获取D加粗样式OM 进入而控制DOM的行为 Ref 有什么用? useRef返回一个可变的 ref 对象,其 .current 属性被初始化为传递的参数 ( initialValue)。返回…

常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件

常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件1. vim 的基本介绍和使用1.1 vim的三种模式1.2 常用vim命令【小白】1.3 Vim键盘图:2. Linux用户管理2.1 添加用户2.2 删除用户2.3 修改账号3. Linux系统用户组的管理4. 用户和组相关文件4.1 …

RuoYi-Vue部署(Nginx+Tomcat)

环境搭建RuoYi-Vue搭建、Linux安装Nginx、Linux安装JDK8、Linux安装MySql8、Linux安装Redis、Linux安装Tomcat9前端打包 1.ruoyi-ui鼠标右键-->打开于终端2.安装依赖:npm install --registryhttps://registry.npm.taobao.org-->node_modules3.编译打包&#x…

中国天气——西风带环流和寒潮

中国天气——西风带环流和寒潮 一. 西风环流概述 1. 概念 西风带:中高纬度地区平均水平环流在对流层盛行西风,称之为西风带西风带波动:西风带围绕极涡沿纬圈运动,平均而言表现为冬季三槽三脊,夏季四槽四脊&#xff…

盘点八个简单易上手的前端低代码框架项目

低代码近年来做为前端市场上火爆到不行的项目,其热度也是长久不衰,本文就为大家盘点了8个简单易上手的前端低代码框架项目,并各自都附上了体验链接,欢迎大家前往体验哦~~~~ 1. Appsm…

elementUI-plus虚拟表el-table-v2 checkbox删除后,下一个复选框又被选中且无法删除

虚拟表种设置了checkbox,但是删除时,发现删除后,下一个checkbox自动被选中,且删除时,报错找不到id没有设置row-key每行的 key 值,如果不提供,将使用索引 index 代替2.row-key值设置成什么值&…

openwrt开发板与ubuntu nfs挂载

1.ubuntu需要安装nfs服务 sudo apt-get install nfs-common nfs-kernel-server2.修改 /etc/exports文件: /home/test *(rw,nohide,insecure,no_subtree_check,async,no_root_squash) 前面是挂载的目录,后边是相应权限 rw:读写 insecure&am…

Is ChatGPT a general-purpose natural language processing task solver?

声明:平时看些文章做些笔记分享出来,文章中难免存在错误的地方,还望大家海涵。搜集一些资料,方便查阅学习:http://yqli.tech/page/speech.html。语音合成领域论文列表请访问http://yqli.tech/page/tts_paper.html&…

Android常用9种自动化测试框架对比,Appium有哪些优势?

随着移动终端的普及,手机应用越来越多,也越来越重要。 App的回归测试用例数量也越来越多,全量回归也越来越消耗时间。移动 APP自动化测试 的难点移动 APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化…

【数据结构】动态顺序表的接口实现(附图解和源码)

动态顺序表的接口实现(附图解和源码) 文章目录动态顺序表的接口实现(附图解和源码)前言一、定义结构体二、每一个接口的实现原理(附图解)1.初始化顺序表2.增容顺序表3.尾插数据4.删除顺序表信息&#xff08…

git rebase 和 git merge,实际工作使用

概述 git rebase是用来处理git merge命令所处理的同样的问题。 这两个命令都用于把一个分支的变更整合进另一个分支——只不过他们达成同样目的的方式不同。 场景,你在feature分支上开,另一位团队成员更新了main分支。这将会造成一个分叉的提交历史&am…

【Java|多线程与高并发】详解start()方法和run()方法的区别

文章目录前言1.start()方法和run()方法2.不能两次调用start()方法3.线程的执行是随机的start()方法和run()方法的执行顺序不一定相同4.run()方法由JVM调用public Thread(Runnable target)中的target前言 本篇文章主要讲解以下几个问题: start()方法和run()方法的区别与联系为…

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

问题 当绘图时,往往并不需要绘制整块区域,而是想聚焦于局部地区,此时我们需要绘制扇形图。 在cartopy中,只提供普通正方形的框架,如果我们需要其他,边界,需要自己去绘制,最常见的是…

程序分析与神经网络后门

原文来自微信公众号“编程语言Lab”:程序分析与神经网络后门 搜索关注“编程语言Lab”公众号(HW-PLLab)获取更多技术内容! 欢迎加入编程语言社区 SIG-程序分析,了解更多程序分析相关的技术内容。 加入方式:…

Nginx常用命令及具体应用(Linux系统)

目录 一、常用命令 1、查看Nginx版本命令,在sbin目录下 2、检查配置文件的正确性 3、启动和停止Nginx 4、查看日志,在logs目录下输入指令: 5、重新加载配置文件 二、Nginx配置文件结构 三、Nginx具体应用 1、部署静态资源 2、反向代…

MacOS Pytorch 机器学习环境搭建

学习 Pytorch ,首先要搭建好环境,这里将采用 Anoconda Pytorch PyCharm 来一起构建 Pytorch 学习环境。 1. Anoconda 安装与环境创建 Anoconda 官方介绍:提供了在一台机器上执行 Python/R 数据科学和机器学习的最简单方法。 为什么最简单…

springmvc考研交流平台 java ssm mysql

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,考研交流平台当然也不能排除在外,从备考资料、课程学习的统计和分析,在过程中会产生大量的、各种各样的…