Java中volatile关键字的作用
作者:??请叫我黄同学???? 发布时间:2023-06-02 17:02:55
一、volatile作用
可以保证多线程环境下共享变量的可见性
通过增加内存屏障防止多个指令之间的重排序
二、什么是可见性
可见性是指当一个线程对于共享变量的修改,其他线程可以立刻看到修改之后的一个值,可见性本质上由几个方面造成的
cpu层面的高速缓存,在cpu里面呢设计了 * 缓存去解决cpu运算效率和内存IO效率的问题,但是它也带来缓存一致性的一个问题,而在多线程执行的情况下呢,缓存一致性的问题就会导致可见性的问题,所以,对于增加了volatile
关键字的一个修饰的共享变量,jvm虚拟机会自动去增加一个#lock汇编指令,而这个指令会去根据不同的cpu型号会自动添加总线锁
或者缓存锁
三、什么是总线锁和缓存锁
总线锁是锁定cpu前端总线,从而去导致在同一个时刻,只能有一个线程和内存通信,这样就避免了多线程并发造成的可见性问题
缓存锁是对总线锁的一个优化,因为总线锁导致cpu的使用效率大幅度下降,所以,缓存锁只针对于cpu * 缓存中的目标数据去加锁,而缓存锁使用MESI缓存一致性协议来实现的
四、什么是指令重排序
指令重排序指令在编写的数据顺序和执行顺序是不一致的,从而在多线程环境下导致可见性问题,指令重排序本质上是一种性能优化的手段,指令重排序来自于几个方面
cpu层面针对于
MESI协议
更进一步的优化,去提升cpu一个利用率,他引入一个叫StoreBuffer
的一个机制,而这种优化机制呢,会导致cpu的乱序执行,为了避免这样的问题,cpu提供内存屏障指令,上层应用可以在合适的地方去插入内存屏障,去避免cpu指令重排序的一个问题编译器在编译的过程中,在不改变单线程语义和程序正确性的前提下,对指令进行合理的重排序,从而去优化整体的一个性能,所以共享变量增加了
volatile
关键字那么 编译器层面就不会触发编译器的优化,同时在jvm里面呢,他会插入内存屏障指令来避免重排序的问题
除了volatile
关键字,从JDK5开发,JMM就使用一种Happens-Before
的模型去描述多线程可见性的一个关系,也就是两个操作之间具备Happens-Before
关系,那么这两个操作具备可见性的一个关系,不需要再额外去考虑增加volatile
关键字来提供可见性的一个保障
来源:https://juejin.cn/post/7083011675934179336
猜你喜欢
- 普通 jar 包的导出1.点击 file 中的project.structor=>选择Artifacts=>+=>选择 j
- 下面通过图文并茂的方式给大家分享C#实现KTV点歌系统。public enum SongPlayState { //未播放,播放
- 表单代码<!DOCTYPE html><html lang="en" xmlns="http
- 简介在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需
- 首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中。 我主要是在原生源码中添
- 本文实例讲述了C#封装的常用文件操作类。分享给大家供大家参考。具体如下:这个C#类封装了我们经常能用到的文件操作方法,包括读写文件、获取文件
- 本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下。从一个例子入手:实现一个银行账户取钱场景的实例代码。第一
- windows系统中的画板工具,有好几种画刷,C#中并没有直接对应可使用的类,只能自己研究。1.画刷原理根据本人对PS的相关功能细心分析,发
- 前言前段时间看到一道面试题:“main函数可以被重载么?”,当时就蒙圈了,怎么还会有这种面试题,现在
- 1. 缓存、两级缓存1.1 内容说明Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明sprin
- 谷歌官方推出了一种侧滑菜单的实现方式(抽屉效果),即 DrawerLayout,这个类是在Support Library里的,需要加上and
- 本文实例讲述了java实现变更文件查询的方法。分享给大家供大家参考。具体如下:自己经常发布包时需要查找那些文件时上次发包后更新的数据文件,所
- 本文实例讲述了Java循环队列原理与用法。分享给大家供大家参考,具体如下:在正式进行循环队列学习之前,我们先来看看在顺序队列中删除队首元素出
- 前言:GraphQL既是API查询语言,也是使用当前数据执行这些查询的运行时。GraphQL让客户能够准确地要求他们所需要的东西,仅此而已,
- 一个类,有时候搞不清楚到底用成员变量还是属性。 如: 成员变量 public string
- 这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下
- 一.IDEA开发环境1.pom文件设置<properties> <maven.compiler.
- 我们先来看完整的代码:import java.io.File;public class JudgeFile {public static v
- 前言我们知道,IOC是Spring的核心。它来负责控制对象的生命周期和对象间的关系。举个例子,我们如何来找对象的呢?常见的情况是,在路上要到
- 公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生