首页 > 编程语言 >Java volatile 深度解析

Java volatile 深度解析

时间:2024-07-09 17:58:17浏览次数:24  
标签:排序 Java 屏障 volatile 内存 操作 解析

简介

被 volatile 修饰的变量有两大特点:

  • 当写一个 volatile 变量时,JMM 会把线程对应的本地内存中的共享变量值立即刷新回主内存中。
  • 当读一个 volatile 变量时,JMM 会把线程对应的本地内存设置为无效,需要工作线程重新回到主内存中读取最新共享变量。

所以 volatile 的写的内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。

JMM 全称为 Java Memory Model 本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了 Java 程序中(尤其是多线程)各个变量的读写访问方式。关键技术点都是围绕多线程的原子性、可见性和有序性展开的。

内存屏障

内存屏障,也称为内存栅栏或栅栏指令,是一类同步屏障指令,是 CPU 或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作,避免代码重排序。即内存屏障之前的所有写操作都要回写到主内存中,内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果。

重排序是指编译器和处理器为了优化程序性能而对指令进行重新排序的一种手段,有时候会改变程序语句的执行先后顺序。通常只有不存在数据依赖关系才可以重排序,若存在数据依赖关系禁止重排序!

内存屏障大致分为两种:

  • 读屏障(Load Barrier):在读指令之前插入读屏障,让工作内存或 CPU 高速缓存当中的缓存数据失效,重写回到主内存中获取最新数据。
  • 写屏障(Store Barrier):在写指令之后插入写屏障,强制把写缓冲区的数据刷回到主内存中。

Java 中的内存屏障其实就是一种 JVM 指令,JMM 的重排序规则会要求 Java 编译器在生成 JVM 指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatile 实现了 Java 内存模型中的可见性和有序性(禁重排),但 volatile 无法保证原子性。

在 Java 中,对于 volatile 变量的写操作,JVM 会在写操作之前添加一个 StoreStore 屏障,保证前面的所有写操作都已经刷新到主内存且禁止前面的其它写操作和后面的 volatile 写重排序。会在 volatile 写操作之后添加一个 StoreLoad 屏障,保证前面 volatile 写操作数据已经刷新到主内存且禁止上面的 volatile 写和下面的其它读操作重排序。

在 Java 中,对于 volatile 变量的读操作,JVM 会在读操作之后添加 LoadLoad 屏障和 LoadStore 屏障,LoadLoad 屏障来禁止上面的 volatile 读操作和下面的其它读操作重排序。LoadStore 屏障来禁止上面的 volatile 读操作和下面的其它写操作重排序。

标签:排序,Java,屏障,volatile,内存,操作,解析
From: https://www.cnblogs.com/ljzy666/p/18292480

相关文章

  • 【转】-Java反射
    Java反射由浅入深|进阶必备原文链接本博文主要记录我学习Java反射(reflect)的一点心得,在了解反射之前,你应该先了解Java中的Class类,如果你不是很了解,可以先简单了解下。一、Java反射机制参考了许多博文,总结了以下个人观点,若有不妥还望指正:Java反射机制在程序运行时,......
  • 教你了解八大排序(含代码注释示例java)
    目录1.冒泡排序(BubbleSort)2.选择排序(SelectSort)3.插入排序(InsertionSort)4.希尔排序(ShellSort)5.归并排序(MergeSort)6.快速排序(QuickSort)7.堆排序(HeapSort)8.基数排序(RadixSort)1.冒泡排序(BubbleSort)这是最简单的排序算法之一。它......
  • 探秘odpdx32.dll:核心功能解析与缺失修复指南
    odpdx32.dll是一个动态链接库(DLL)文件,通常与DirectX或OpenGL相关的软件或游戏有关。这个文件可能包含了用于处理图形渲染和多媒体播放的函数和资源,是系统中重要的组件之一。当你的计算机在运行某些应用程序时提示缺少odpdx32.dll文件,这意味着该应用程序依赖于这个文件,但当前系......
  • 深入解析:api-ms-win-net-isolation-l1-1-0.dll的角色与丢失修复指南
    api-ms-win-net-isolation-l1-1-0.dll是一个Windows操作系统中的动态链接库(DLL)文件,它与网络隔离功能相关,属于WindowsAppContainer和WindowsSandbox功能的一部分。这个DLL文件负责处理网络请求的隔离,确保应用程序在AppContainer或Sandbox环境中只能访问授权的网络资源,这对于增......
  • 【狂神说Java】系列学习笔记01——MarkDown语法
    #MarkDown学习本文为B站老师秦疆【狂神说Java】系列,课堂学习笔记,主要联练习的是MarkDown的使用方法,老师的博客链接我没找到,广告1.标题+加粗2级3级4级5级6级最多七级标题Helloworld!Helloworld!Helloworld!Helloworld!引用-沐风6标题一级标题(#+空格)二......
  • Java IO
    JavaI/OBIO详解BIO就是:blockingIO。最容易理解、最容易实现的IO工作方式,应用程序向操作系统请求网络IO操作,这时应用程序会一直等待;另一方面,操作系统收到请求后,也会等待,直到网络上有数据传到监听端口;操作系统在收集数据后,会把数据发送给应用程序;最后应用程序受到数据,并解除......
  • java+selenium+autoIt 实现下载(打印)功能
    java+selenium+autoIt实现下载(打印)功能selenium是一个开源的自动化测试框架,它可以模拟用户对浏览器的操作,进行自动化的测试。但是,它不仅仅只能用来做测试。AutoIt是一个使用类似BASIC脚本语言的免费软件,它设计用于WindowsGUI(图形用户界面)中进行自动化操作。它利用模拟键盘......
  • [Java SE] Java-文件系统-常用文件路径的获取方法
    1获取相对路径/***获取相对路径【推荐】*使用Java提供的Path类和Paths类来获取相对路径。*例如,假设有两个路径a和b,我们可以使用Path类的relativize()方法来获取相对路径,该方法返回一个相对路径的Path对象。*/@TestpublicvoidgetRelativePathTest1(){ Pathpath......
  • 解析coredump文件
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、coredump是什么?二、操作步骤总结前言编写程序的时候可能会遇到coredump问题,如下方法可以解析dump,简单定位报错问题内核版本:5.10提示:以下是本篇文章正文内容,下面案例可供参考一、......
  • JAVA-二维数组-要求计算出每个季度的总营业额和全年的总营业额-求指导
            二维数组的练习某商城每个季度的营业额如下:单位(万元)第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99要求计算出每个季度的总营业额和全年的总营业额package_exercis;publicclassTwoArray{publicstaticvoidmain(S......