JMM 简单理解
JMM 简单理解
1 Java 内存模型
Java 内存模型(Java Memory Model,JMM),主要为了屏蔽各种硬件和操作系统的内存差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果,而设计的
2 工作内存与主内存
JMM 包括两大区域,工作内存和主内存。下图表示线程、工作内存、主内存三者的交互关系

线程对应的的工作内存,保存该线程所使用的主内存变量的副本,线程对变量的所有操作(读取赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据,不同线程也无法访问对方工作内存中的变量
3 内存间的交互操作
- lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态
- unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
- read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用
- load(载入):作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中
- use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作
- assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收的值赋给工作内存的变量, 每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
- store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的 write 操作使用
- write(写入):作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中
4 经典代码案例
package com.fzshuai.volatile1;import java.util.concurrent.TimeUnit;/*** @author fzshuai* @date 2023/10/26 23:32* @since 1.0*/
public class JMMDemo {private static int num = 0;public static void main(String[] args) {new Thread(() -> {while (num == 0) {}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}num = 1;System.out.println(num);}
}
为什么程序一直在执行没有停止呢?让我们来看看线程与内存之间的交互,不难发现线程 B 改变了变量 num 的值,但是线程 A 并不知道

5 资源的可见性
相关文章:
JMM 简单理解
JMM 简单理解 1 Java 内存模型 Java 内存模型(Java Memory Model,JMM),主要为了屏蔽各种硬件和操作系统的内存差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果,而设计的 2 工作内存与主内…...
微软Azure文本转音频,保存成MP3文件【代码python3】
标签: 文本转音频并保存mp3文件; 微软Azure; 微软Azure可以将文本转音频,并保存mp3文件,直接上代码 代码格式:python 3 import os import azure.cognitiveservices.speech as speechsdk# This example re…...
基于单片机的超声波探伤仪设计
摘要 超声波探伤仪是目前工业制造和现代化检测的重要途径之一,广泛的应用在质量检测和产品检测中,通过使用其产品能够有效地降低产品次品的风险。尽管随着电子技术的发展, 国内出现了一些数字化的超声检测仪器,但其数据处理及扩展…...
idea的设置
1.设置搜索encoding,所有编码都给换为utf-8 安装插件 eval-reset插件 https://www.yuque.com/huanlema-pjnah/okuh3c/lvaoxt#m1pdA 设置活动模板,idea有两种方式集成tomcat,一种是右上角config配置本地tomcat,一种是插件,如果使用插件集成,则在maven,pom.xml里面加上tomcat…...
高等数学啃书汇总重难点(八)向量代数与空间解析几何
持续更新,高数下第一章,整体来说比较简单,但是需要牢记公式,切莫掉以轻心~ 一.向量平行的充要条件 二.向量坐标的线性运算 三.向量的几何性质 四.数量积 五.向量积 六.混合积 七.曲面方程 八.空间曲线方程 九.平面的点法式方程 十…...
C#开发DLL,CAPL调用(CAPL>> .NET DLL)
文章目录 展示说明新建类库工程C# 代码生成dllCAPL脚本调用dll,输出结果展示 ret为dll里函数返回的值。 说明 新建类库工程 在visual studio中建立。 C# 代码 using...
0-1背包问题【穷举法+二维dp数组】
问题描述: 使用穷举法解决0/1背包问题。问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn} 的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。 穷举法:每件物品装还是…...
nodejs+vue+python+php基于微信小程序的在线学习平台设计与实现-计算机毕业设计
困扰管理层的许多问题当中,在线学习也是不敢忽视的一块。但是管理好在线学习又面临很多麻烦需要解决,例如:如何在工作琐碎,记录繁多的情况下将在线学习的当前情况反应给课程问题管理员决策,等等。 流,开发一个在线学习平台小程序一方面的可能会更合乎时宜,另一方面来…...
Spring学习笔记2 Spring的入门程序
Spring学习笔记1 启示录_biubiubiu0706的博客-CSDN博客 Spring官网地址:https://spring.io 进入github往下拉 用maven引入spring-context依赖 写spring的第一个程序 引入下面依赖,好比引入Spring的基本依赖 <dependency><groupId>org.springframework</groupId&…...
【Linux】虚拟机安装Linux、客户端工具及Linux常用命令(详细教程)
一、导言 1、引言 Linux是一个开源的操作系统内核,它最初由芬兰计算机科学家Linus Torvalds于1991年开发。Linux不同于传统的商业操作系统,它常用于服务器、嵌入式系统和个人电脑等各种平台。 Linux具有很多优点,包括稳定性、安全性和可定制…...
Day 47 动态规划 part13
Day 47 动态规划 part13 解题理解300674718 3道题目 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 解题理解 300 dp[i]被设置为以nums[i]为结尾的最长递增子序列长度。 class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if len(nums) …...
【广州华锐互动】飞机诊断AR远程指导系统为工程师提供更多支持
随着科技的发展,飞机的维护工作也在不断进步。其中,AR(增强现实)技术的应用使得远程运维成为可能。本文将探讨AR在飞机诊断远程指导系统中的应用,以及它对未来航空维护模式的影响。 AR远程指导系统是一种使用增强现实技…...
【贝叶斯回归】【第 2 部分】--推理算法
一、说明 在第一部分中,我们研究了如何使用 SVI 对简单的贝叶斯线性回归模型进行推理。在本教程中,我们将探索更具表现力的指南以及精确的推理技术。我们将使用与之前相同的数据集。 二、模块导入 [1]:%reset -sf[2]:import logging import osimport tor…...
【深入浅出汇编语言】寄存器精讲第二期
🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板、汇编语言 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️物理地址二. ⛳️16位结构的CPU三. ⛳️8086CPU给出物理地址的方…...
如何保证分布式情况下的幂等性
关于这个分布式服务的幂等性,这是在使用分布式服务的时候会经常遇到的问题,比如,重复提交的问题。而幂等性,就是为了解决问题存在的一个概念了。 什么是幂等 幂等(idempotent、idempotence)是⼀个数学与计算机学概念,常⻅于抽象代数中。 在编程中⼀个幂等操作的特点是…...
Mybatis特殊SQL的执行
文章目录 模糊查询批量删除动态设置表名添加功能获取自增的主键自定义映射resultMapresultMap处理字段和属性的映射关系 多对一映射处理级联方式处理映射关系使用association处理映射关系 分步查询1. 查询员工信息 2. 查询部门信息 一对多映射处理collection 模糊查询 /*** 根…...
MyBatis-Flex(一):快速开始
框架介绍 MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。 MyBatis-Flex 官方文档 说明 本文参照官方文档的【快速开始】 章节,编写 Spring Boot 项目的代码示例。 快速开始 创建数据库表 直接参照官网示…...
Vue组件化
组件 组件是实现应用中局部功能的代码(HTML,CSS,JS)和资源(图片,声音,视频)的集合,凡是采用组件方式开发的应用都可以称为组件化应用 模块是指将一个大的js文件按照模块化拆分规则进行拆分成的每个js文件, 凡是采用模块方式开发的应用都可以称为模块化应用(组件包括模块) 传…...
nodejs+python+php+微信小程序-基于安卓android的健身服务应用APP-计算机毕业设计
考虑到实际生活中在健身服务应用方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。 则对于进一步提高健身服务应用发展,丰富健身服务应用经验能起到不少的促进作用。 健身服务应用APP能够通过互联网得到广泛的、全面的宣…...
SpringCloud 微服务全栈体系(九)
第九章 Docker 三、Dockerfile 自定义镜像 常见的镜像在 DockerHub 就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就必须先了解镜像的结构才行。 1. 镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而…...
基尼系数 vs 信息增益:决策树划分标准选哪个?实测对比告诉你答案
基尼系数 vs 信息增益:决策树划分标准选哪个?实测对比告诉你答案 决策树算法作为机器学习中最直观的可解释模型,其核心在于如何选择最优特征进行节点划分。面对基尼系数(Gini Index)与信息增益(Informatio…...
Unity URDF导入终极指南:3步快速实现机器人仿真
Unity URDF导入终极指南:3步快速实现机器人仿真 【免费下载链接】URDF-Importer URDF importer 项目地址: https://gitcode.com/gh_mirrors/ur/URDF-Importer Unity URDF Importer是Unity Robotics官方推出的机器人模型导入工具,它能够让你在Unit…...
QobuzDownloaderX-MOD:一站式高品质音乐下载解决方案
QobuzDownloaderX-MOD:一站式高品质音乐下载解决方案 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownloaderX-MOD…...
从SWF中提取加密通信协议:JPEXS Free Flash Decompiler安全分析报告
从SWF中提取加密通信协议:JPEXS Free Flash Decompiler安全分析报告 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在网络安全分析领域,SWF(Shockwa…...
简述双亲委派机制以及其优点
面试 概念:加载类的时候先交给自己的父类加载器执行,直到顶层的启动类加载器,如果父加载器能够完成加载,则交给父类加载器,否则自己尝试加载。 优点:保证类的加载的安全性,避免类的重复加载。...
Apache Doris 存储与查询优化实战:从架构设计到性能调优的完整指南
1. Apache Doris 架构设计精要 第一次接触Apache Doris时,我被它简洁的架构设计惊艳到了。这个MPP架构的分析型数据库,用计算存储分离的设计思路,把复杂的大数据分析变得像查普通MySQL表一样简单。FE(Frontend)和BE&am…...
Windows 11终极清理优化指南:用Win11Debloat快速提升系统性能
Windows 11终极清理优化指南:用Win11Debloat快速提升系统性能 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以…...
求一个V站邀请码
有没有大佬可以给个邀请码~~~~~~~~~~~~~~~~~~...
别再只盯着GNSS了!用移远EC20模组实现基站定位的完整配置流程(含免费Token申请)
移远EC20模组基站定位实战:从零配置到室内场景精准落地 在物联网设备定位领域,GNSS卫星定位长期占据主导地位,但鲜为人知的是,像移远EC20这样的LTE模组还隐藏着一个被低估的功能——基站定位。当你的智能水表安装在地下室、共享设…...
告别C盘爆炸!手把手教你将Dify+Docker数据盘迁移到D盘(附.ENV配置详解)
告别C盘爆炸!手把手教你将DifyDocker数据盘迁移到D盘(附.ENV配置详解) Windows系统盘空间告急是许多开发者的共同烦恼,尤其是当你开始使用Docker部署AI开发环境时。C盘空间像被黑洞吞噬一样迅速消失,系统运行速度也随之…...
