首页 > 系统相关 >volatile与java内存模型

volatile与java内存模型

时间:2023-06-01 18:44:22浏览次数:45  
标签:java 屏障 指令 volatile 内存 操作

一、结论

先说结论,volatile能保证可见性和有序性,不能保证原子性。

二、volatile的内存语义

当写一个volatile变量时,会将变量值刷新回主内存

当读一个volatile变更时,会从主内存中读取最新值

三、内存屏障

是什么?

内存屏障是一类同步屏障指令,是cpu或编译器在对内存随机访问操作的一个同步点,使得该点之前的读写操作都执行后才开始执行此点的操作,避免代码重排序。

进一步说明,内存屏障就是一种jvm指令,java内存模型的重排规则要求java编译器在生成jvm指令时插入特定的内存屏障指令,volatile通过内存屏障指令保证了有序性和可见性。

 

内存屏障之前的写操作都刷新会主内存。

内存屏障之后的读操作都会获得内存屏障之前的所有写操作的最新结果。保证了可见性

重排序时,不允许把内存屏障之后的操作重排到内存屏障之前。

 

四、happens-before的volatile变量规则

当第一个操作为volatile读时,不论第二个操作是什么都不允许重排

当第二个操作为volatile写时,不论第一个操作是什么都不允许重排

当第一个操作为volatile写,第二个操作为volatile读时,不允许重排序

 

jmm会在每个volatile写前面插入一个StoreStrore屏障

jmm会在每个volatile写后面插入一个StoreLoad屏障

jmm会在每个volatile读后面插入一个LoadLoad和一个LoadStore屏障

 

标签:java,屏障,指令,volatile,内存,操作
From: https://www.cnblogs.com/yumx/p/17449911.html

相关文章

  • JAVA面试题整理
    本文分为十九个模块,分别是:「Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/SpringMVC、SpringBoot/SpringCloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」,如下图所示:   共包含208道面试题,本文的......
  • 常用的Java Enum JdbcType
    常用的JavaEnumJdbcTypeARRAYBIGINTBINARYBITBLOBBOOLEANCHARCLOBCURSORDATEDECIMALDOUBLEFLOATINTEGERLONGVARBINARYLONGVARCHARNCHARNCLOBNULLNUMERICNVARCHAROTHERREALSMALLINTSTRUCTTIMETIMESTAMPTINYINTUNDEFINEDVARBINARYVARCHAR参考资料......
  • Java 基本知识——first day
    注释注释不会被执行,是写给看代码的人看的。三种注释单行注释多行注释文档注释标识符关键字Java常见的关键字考点总结四个点:首字母应该以字母、$、_开始;开始后可以任意字符;不可用关键字大小写敏感 数据类型Java是一门强类型语言强类型语言比如......
  • Java多线程三(线程池执行完后再执行主线程)CountDownLatch
      我们在开发多线程的时候,有两种情况一种是我们处理好后,不用管结果。比如我需要查询某些数据然后存在数据库里。还有一种就是查询好数据(通过线程池),然后导出数据。这个就比较麻烦。因为我们要将数据通过多线程处理后,返回一个统一的结果。(由于多线程是在不同的时候执行数据),假如执......
  • 二级指针内存模型
    二级指针做输出模型#define_CRT_SECURE_NO_WARNINGS#include<stdlib.h>#include<string.h>#include<stdio.h>//指针做输出:被调用函数分配内存-----OK//指针做输入:主调用函数分配内存//求文件中的两段话的长度intgetMem(char**myp1,int*mylen1,char**myp2,in......
  • Java中将网上的png,jpg等存储在图片服务器中并且转成pdf,并且返回相应的url地址。
    通常在开发的时候,我们会遇到图片上传的功能,特别是有很多是提供url地址的方式。所以需要提供一个将url的图片等存储起来,然后提供一个我们自己的地址给用户使用。第一步:提供pdfbox的jar包。准备相应的maven    <dependency><groupId>org.apache.pdfbox</groupId......
  • IDEA虚拟内存优化
      按照自己需求更改即可(下面是本人的,本人电脑16G内存):   ......
  • volatile为什么不能保证原子性
    首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢?可见性可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带......
  • ‘dependencies.dependency.version‘ for mysql:mysql-connector-java:jar is missin
    项目使用的技术框架是SpringBoot,依赖管理工具是Maven,需要用到数据库所以引入了mysql-connector-java相关jar包。之前项目一直正常的,不会报错,最近更新了一下版本,项目启动的时候直接报错:[INFO]Scanningforprojects...[ERROR][ERROR]Someproblemswereencounteredwhilep......
  • Java中使用Redis
    应用框架SpringDataRedisSpringDataRedis介绍SpringDataRedis是Spring的一部分,提供了在Spring应用中通过简单的配置就可以访问Redis服务,对Redis底层开发包进行了高度封装。在Spring项目中,可以使用SpringDataRedis来简化Redis操作。Maven坐标点击查看代......