Java Memory Model

news/2024/11/30 2:24:58/

JMM(Java Memory Model)是什么?:

   JMM是一份规范,它规定了 JVM 在多线程并发访问共享内存中的数据时,线程的行为规范和模型。

   JMM 规定了所有的变量都存储在主内存中,每个线程都有自己的工作内存,线程对变量进行操作时需要先把变量从主内存中复制到工作内存中,操作完成后再将结果写回主内存。

解决了什么问题?

   不同的操作系统都有自己的一套内存模型,如果直接复用操作系统层面的内存模型,就可能会导致同样一套代码换了一个操作系统就无法执行了。Java 语言是跨平台的,它需要自己提供一套内存模型以屏蔽系统差异,将内存模型的复杂操作内聚起来。对于 Java 开发者说,你不需要了解底层原理,直接使用并发相关的一些关键字和类(比如 volatile、synchronized、各种 Lock)即可开发出并发安全的程序

volatile特性:

  1. 保证了内存可见性。
    对于使用volatile修饰的变量,当线程改变了他的值,JMM会立即将其刷新到主内存中;每次使用前,再从主内存中读出

  2. 防止指令重排序
    JMM会使用指令实现内存屏障功能,禁止读写该变量前后语句的重排序优化,保证编译后代码的执行顺序和程序中编写的一致

  3. 不具备原子性
    对于复合操作不具备原子性。所以在对 volatile 修饰变量的复合操作中,应使用synchronized或Lock来同步,例如 volatileInt++ 是一个复合操作,在多线程环境下,就需要加锁同步。

专题分析

指令重排序

什么是指令重排序?

   简单来说就是系统在执行代码的时候并不一定是按照你写的代码的顺序依次执行。

常见的指令重排序有下面 2 种情况:

  1. 编译器优化重排 :编译器(包括 JVM、JIT 编译器等)在不改变单线程程序语义的前提下,重新安排语句的执行顺序。
  2. 指令并行重排 :现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

   Java 源代码会经历 编译器优化重排 —> 指令并行重排 —> 内存系统重排 的过程,最终才变成操作系统可执行的指令序列。

   编译器和处理器的指令重排序的处理方式不一样。对于编译器,通过禁止特定类型的编译器重排序的方式来禁止重排序。对于处理器,通过插入内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)的方式来禁止特定类型的处理器重排序。指令并行重排和内存系统重排都属于是处理器级别的指令重排序。

内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将主内存的值写入高速缓存,清空无效队列,从而保障变量的可见性。


http://www.ppmy.cn/news/56210.html

相关文章

尚融宝25-投资列表展示以及实现充值功能

目录 一、展示投资列表 (一)需求 (二)后端 (三)前端 二、充值功能 (一)需求 1、需求描述 2、流程 (二)充值 1、后端 2、前端 (三&…

数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)

目录 题意理解 问题 描述 输入样例 输出样例 求解思路 建两棵二叉树 不建树 建一棵树 搜索树表示 程序框架搭建 如何建搜索树 如何判别 方法 查找函数 判断函数 其他函数 题意理解 给定一个插入序列就可以唯一确定一颗二叉搜索树。 但是,一颗给定…

82. Python split方法-分割字符串

82. split方法-分割字符串 文章目录 82. split方法-分割字符串1. 什么是split( )函数2. split( )方法的语法格式如下:3. 实操练习4. 列表索引取值知识回顾5. 用split方法分解网址提取有效信息6. 从地址信息中拆分省、市、区信息 1. 什么是split( )函数 split[splɪ…

vue相关知识导学

学习资料 Vue 相关源码地址: vue2.0 GitHub - vuejs/vue: This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/coreVue3.0 GitHub - vuejs/core: 🖖 Vue.js is a progressive, incrementally-adoptable JavaScri…

Python 装饰器是怎么写的

其实我们已经创建了一个装饰器! 一切皆对象,那是我的对象 现在我们修改下上一个装饰器,并编写一个稍微更有用点的程序: def a_new_decorator(a_func):def wrapTheFunction():print("I am doing some boring work before exe…

Python中的数据类型(python专栏002)

Python 中常用的数据类型包括: 数字类型:包括整型(int)、长整型(long)、浮点型(float)、复数型(complex)。字符串类型(str):用于保存文本数据,可以使用单引号、双引号或三引号来定义字符串。列表类型(list):可以保存多…

用ChatGPT通过WebSocket开发一个交互性的五子棋微信小程序(二)

文章目录 1 前言1.1 实现的原理1.2 如何与微信小程序联系 2 五子棋项目2.1 申请OpenAI的API2.2 调用API代码2.3 界面代码 3 同步五子棋到前端小程序3.1 WebSocket长连接3.2 获取实时下棋 4 讨论 1 前言 1.1 实现的原理 大体方向是将ChatGPT作为后端语言模型,然后将…

比较全的颜色RGB值对应表 8位 16位

实色效果英文名称R.G.B16色实色效果英文名称R.G.B16色Snow255 250 250#FFFAFAPaleTurquoise1187 255 255#BBFFFFGhostWhite248 248 255#F8F8FFPaleTurquoise2174 238 238#AEEEEEWhiteSmoke245 245 245#F5F5F5PaleTurquoise3150 205 205#96CDCDGainsboro220 220 220#DCDCDCPaleT…