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关键字的作用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解SpringBoot集成消息队列的案例应用

    详解SpringBoot集成消息队列的案例应用

    Message Queue又名消息队列,是一种异步通讯的中间件。可以理解为邮局,发送者将消息投递到邮局,然后邮局帮我们发送给具体的接收者,具体发送过程和时间与我们无关。 消息队列是分布式系统中重要的组件,消息队列主要解决了应用耦合、异步处理、流量削锋等问题
    2022-04-04
  • Spring读取配置文件属性实现方法

    Spring读取配置文件属性实现方法

    这篇文章主要介绍了Spring读取配置文件属性实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java concurrency之LockSupport_动力节点Java学院整理

    Java concurrency之LockSupport_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency之LockSupport的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Springboot事务失效的几种情况解读

    Springboot事务失效的几种情况解读

    这篇文章主要介绍了Springboot事务失效的几种情况解读,因为Spring AOP默认使用动态代理,会给被代理的类生成一个代理类,事务相关的操作都通过代理来完成,使用内部方法调用时,使用的是实例调用,没有通过代理类调用方法,因此事务不会检测到失败,需要的朋友可以参考下
    2023-10-10
  • javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException是与Java Management Extensions (JMX) API相关的一个常见异常,本文主要介绍了javax.management.InvalidApplicationException的问题解决,感兴趣的可以了解一下
    2024-08-08
  • java实现excel自定义样式与字段导出详细图文教程

    java实现excel自定义样式与字段导出详细图文教程

    最近接到一个需求,客户不满意原本导出的csv文件,想要导出Excel文件,下面这篇文章主要给大家介绍了关于java实现excel自定义样式与字段导出详细图文教程
    2023-09-09
  • 深入java对象复制的分析

    深入java对象复制的分析

    本篇文章是对java对象复制进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java 详解异常的处理机制

    Java 详解异常的处理机制

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如你的代码少一个分号,那运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那你是因为用0做了除数,会抛出 java.lang.ArithmeticException 的异常
    2021-11-11
  • SpringBoot+TestNG单元测试的实现

    SpringBoot+TestNG单元测试的实现

    本文主要介绍了SpringBoot+TestNG单元测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Java经典面试题汇总:异常

    Java经典面试题汇总:异常

    本篇总结的是Java异常相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07

最新评论