java中volatile关键字的作用详解

 更新时间:2023年09月28日 11:12:14   作者:BeanInJ  
这篇文章主要介绍了java中volatile关键字的作用详解,volatile可以保证,若一个线程改变了某块内存的值,其他线程是可见的,以至于其他线程能及时更新这块内存,需要的朋友可以参考下

1、volatile保证可见性

volatile可以保证,若一个线程改变了某块内存的值,其他线程是可见的,以至于其他线程能及时更新这块内存。

线程拥有自己的内存空间: 每个线程在运行时,都有自己的空间去加载缓存中的值,如果一个值发生改变,会先改变在线程中的值,再在一定时间内同步到缓存中。

volatile可见性: 当两个线程使用同一变量M时,线程1改变了M的值,如果不使用volatile,线程2可能感知不到M发生了改变,继续拿着M在缓存中的值运行。使用volatile的变量,在线程1改变M时,对其他线程来说就是可见的,就会去更新M的值。

在这里插入图片描述

其他发生内存刷新的情况: 有些java代码是已经包含了刷新内存、内存同步的操作,这会使得一些变量不加volatile,也会在多线程中及时更新。例如:调用System.out.println()会刷新内存

2、volatile保证顺序性

volatile修饰的内存,可以(利用 jvm中的内存屏障)保证它在多个代码行中读写的执行是有顺序的。

2.1、重排序与内存屏障

为什么会重排序? 为了提高CPU效率,在结果一致性的前提下,在执行一些较为耗时的操作,CPU并不会空着等待它执行完毕再继续,而是继续执行下面的代码。

在这里插入图片描述

怎么阻止这种不按顺序执行的情况? 如上图,在第二行和第三行之间加一条内存屏障指令,当机器读到内存屏障指令时,就知道要等上一行执行完,才能执行下一行。

在这里插入图片描述

内存屏障有cpu级别的和jvm级别的,cpu级别靠汇编语言特有的指令实现

2.2、jvm中的内存屏障

jvm规范规定,jvm必须实现的4中屏障:LL、LS、SL、SS

L (Load) ,指的是从内存中读一个数据到CPU S (Store),指的是从CPU中写一个数据到内存

LL指第一行是从内存中读一个数据到CPU,第二行也是从内存中读一个数据到CPU,中间加的内存屏障类型就叫LoadLoadBarrier

LS指第一行是从内存中读一个数据到CPU,第二行从CPU中写一个数据到内存,中间加的内存屏障类型就叫LoadStoreBarrier

到此这篇关于java中volatile关键字的作用详解的文章就介绍到这了,更多相关volatile关键字的作用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven Repository仓库的具体使用

    Maven Repository仓库的具体使用

    本文主要介绍了Maven Repository仓库的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 异常try catch的常见四类方式(案例代码)

    异常try catch的常见四类方式(案例代码)

    这篇文章主要介绍了异常try catch的常见四类方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • java 反射 动态调用不同类的静态方法(推荐)

    java 反射 动态调用不同类的静态方法(推荐)

    下面小编就为大家带来一篇JAVA 反射 动态调用不同类的静态方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringBoot如何监控Redis中某个Key的变化(自定义监听器)

    SpringBoot如何监控Redis中某个Key的变化(自定义监听器)

    这篇文章主要介绍了SpringBoot如何监控Redis中某个Key的变化(自定义监听器),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 详解SpringBoot之集成Spring AOP

    详解SpringBoot之集成Spring AOP

    本篇文章主要介绍了详解SpringBoot之集成Spring AOP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Spring使用AOP完成统一结果封装实例demo

    Spring使用AOP完成统一结果封装实例demo

    这篇文章主要介绍了Spring使用AOP完成统一结果封装,本文通过实现demo给大家详细讲解,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Java 高并发六:JDK并发包2详解

    Java 高并发六:JDK并发包2详解

    本文主要介绍Java高并发这里整理了详细资料,并讲解了 1. 线程池的基本使用 2. 扩展和增强线程池 3. ForkJoin的知识,有兴趣的小伙伴可以参考下
    2016-09-09
  • SpringBoot整合RocketMQ实现发送同步消息

    SpringBoot整合RocketMQ实现发送同步消息

    RocketMQ 是一款开源的分布式消息中间件,由阿里巴巴开源,它具有高可用性、高性能、低延迟等特点,广泛应用于阿里巴巴集团内部以及众多外部企业的业务系统中,本文给大家介绍了SpringBoot整合RocketMQ实现发送同步消息,需要的朋友可以参考下
    2024-04-04
  • idea2020.3测试评价及感受

    idea2020.3测试评价及感受

    idea2020.3版本这次变化最大的也就是 UI了完全抛弃了之前一直使用的模板更改成了新的样式,感兴趣的朋友快来下载体验下吧
    2020-10-10
  • Spring Cache指定CacheManager方式

    Spring Cache指定CacheManager方式

    这篇文章主要介绍了Spring Cache指定CacheManager方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论