JUC-Java内存模型JMM
JMM概述
Java Meory Model java内存模型。在不同的硬件和不同的操作系统上,对内存的访问方式是不一样的。这就造成了同一套java代码运行在不同的操作系统上会出问题。JMM就屏蔽掉硬件和操作系统的差异,增加java代码的可移植性。这是一方面。
另一方面JMM定义的一系列规则能够保证线程并发的安全性。主要是保证线程的可见性,有序性,原子性。
具体来说它主要就是抽象了线程和主存之间的关系。(如下图)每个线程都有一个工作内存(cpu缓存),工作内存中存放着主存(内存)的副本,一般是共享变量,比如实例变量,静态变量但是不包括局部变量。线程读写数据是直接操作工作内存的。线程不能访问其他线程的工作内存。多个线程间通信是通过主存来完成的。

线程三大问题
原子性,可见性,有序性。(简记:客源有)
线程需要满足这三大特性,才能保证线程并发安全。而JMM就是为了实现这三大特性定义的一系列规则。
可见性问题
可见性指的是当一个线程修改了共享变量后,另一个线程能够立马得到修改的这个值。但是由于CPU缓存的存在,可见性往往会存在一些问题。
比如说在多线程下,每个线程将变量存放在CPU缓存中,一个线程修改了变量后,放在CPU缓存中。另一个线程无法立即得到最新的值。这就造成了共享变量的数据不一致的问题。
原子性问题
CPU在执行指令的过程中发生了线程切换,会导致一些变量数据不一致,这种问题就成为原子性问题。
有序性问题
CPU在执行指令的时候,为了充分利用内部的计算单元,处理器可能会对代码进行乱序执行。CPU在并发环境下,乱序执行可能会到导致结果错误。这种问题就叫做有序性问题。
JMM解决线程可见性,原子性,有序性问题
定义Java内存模型并非是一件容易的事情。不能单纯的禁用CPU缓存和编译优化,这样会严重影响程序性能。JMM抽象了线程和主存之间的关系,定义了程序中变量的访问规则来解决上述问题。
从抽象的角度来看,JMM定义了线程和主存之间的抽象关系:线程之间的共享变量存放在主内存中,每个线程都有一个私有的工作内存,本地内存中存储了主存中共享变量的副本,线程对变量的操作都是在工作内存中进行的。(这里的工作内存是一个抽象的概念。包含了CPU缓存,寄存器以及编译器优化。主内存则指的是物理硬件的主内存。)

可见性保证
可见性指的是当一个线程修改了共享变量的值之后,其他线程能够立马得到这个修改。
volatile能够保证可见性和有序性,volatile修饰的变量在本地内存中修改后会立即同步到主存中去,供其他线程访问到。
锁也能保证可见性,锁在释放和申请的时候都会更新缓存,从主存中获取最新的值。
原子性保证
通过Lock和UnLock来保证。java中是synchronized关键字。synchronized关键字对应的底层jvm指令是monitorenter和moniterexit
public void test01(){synchronized (this){int i = 1;}}
有序性保证
java中提供了volatile和synchronized两个关键字来保证线程之间的有序性。volatile本身就包含了指令重排的语义。而 synchronized 则是由一个变量在同一时刻只允许一个线程对其进行 lock 操作这条规则来保证有序性的
JMM核心概念-happens-before
如果一个操作happens-before另一个操作,那么第一个操作的执行结果对后续的操作是可见的。
两个操作存在happens-before关系,并不意味着一定要按照happens-before原则指定的顺序来执行。可以对指令进行重排序,只要保证结果正确性即可。
参考:
从线程三大特性深入理解JMM(Java 内存模型)
happens-before是什么?JMM最最核心的概念,看完你就懂了
相关文章:
JUC-Java内存模型JMM
JMM概述 Java Meory Model java内存模型。在不同的硬件和不同的操作系统上,对内存的访问方式是不一样的。这就造成了同一套java代码运行在不同的操作系统上会出问题。JMM就屏蔽掉硬件和操作系统的差异,增加java代码的可移植性。这是一方面。 另一方面JM…...
uni-app使用HBuilderX打包Web项目
非常简单,就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…...
前后置、断言、提取变量、数据库操作功能
前置操作和后置操作都是 API 请求在发送和响应过程中执行的脚本,主要用于在发起 API 请求前和获得响应后完成验证或执行某些操作,目的是为了提高 API 调试和测试的效率,并确保接口的正确性。 前置操作 前置操作是在 API 请求之前执行的脚本…...
三子棋/井字棋(C语言)
这个游戏需要用到三个文件 game.h头文件用来申明函数和导包 game.h如下: #pragma once #define ROW 3 #define COL 3 #include <stdlib.h> #include <time.h> #include <stdio.h>//初始化棋盘的函数void InitBoard(char board[ROW][COL], int row, int co…...
数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა
目录 Contact.h说明: 结构体与头文件的包含: 编辑 函数在头文件的声明与定义: Contact.c中各个函数的实现: 1.检查链表中的数据是否满了,满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...
Electron Apple SignIn 登录
本人写博客,向来主张:代码要完整,代码可运行,文中不留下任何疑惑。 最讨厌写博客,代码只留下片段,文中关键的东西没写清楚。之前看了那么多文章,就是不告诉我clientId从哪来的。 官方资料地址&…...
常用中间件漏洞
IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…...
Windows系统使用手册
点击前往查看🔗我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…...
mp4文件可以转成mp3音频吗
现在是个非常流行刷短视频一个年代,刷短视似乎成了人们休闲娱乐的一种方式,在日常刷短视频过程中,肯定会有很多同学被短视频 bgm 神曲洗脑,比如很多被网红翻唱带火的歌曲,例如其中"不负人间”,就是其中…...
Java-IO流【登录注册小项目】
♥️作者:白日参商 🤵♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油!…...
数字化金融时代:探讨全球金融科技创新的最新动态
在当今数字化金融时代,金融科技创新如影随形,迅猛发展。本文将深入探讨全球范围内金融科技的最新动态,剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角,我们将一一解读这个正在不断演变的金融科技画卷…...
LeetCode:206. 反转链表
力扣链接 算法思想:由于单链表是单向的,想要对当前元素进行操作,需找到前一个元素。本题利用双指针,初始pre指针指向NULL,cur指针指向head.再对局部翻转之前,先把下一个结点存到temp指针中。当进行完如下代…...
linux 安装nginx
介绍 官网 https://nginx.org/en/download.html 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel linux 检查是否安装过某软件包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel #下载 wget https://nginx.org/downloa…...
1.C语言——基础知识
C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…...
Redis 存在线程安全问题吗?为什么?
一个工作了 5 年的粉丝私信我。 他说自己准备了半年时间,想如蚂蚁金服,结果第一面就挂了,非常难过。 问题是: “Redis 存在线程安全问题吗?” 一、问题解析 关于这个问题,我从两个方面来回答。 第一个&a…...
无人机测绘助力实现高效、安全的城市规划
随着城市化进程的不断加快,城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具,为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析,为行业提供有力的决策支持,助力城市规划的现代化和可持续发…...
实验七 RMAN恢复管理器
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…...
未来 AI 可能给哪些产业带来哪些进步与帮助?
AI时代如何要让公司在创新领域领先吗?拥抱这5种创新技能,可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…...
Java医院信息管理系统
技术框架: springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境: jdk8 mysql IntelliJ IDEA maven项目功能: 本项目是用springbootlayuishiro写的医院管理系统,系统的业务比较复杂&#x…...
QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)
文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…...
Python与Matlab双剑合璧:高效解析XJTU-SY轴承数据集实战指南
1. 为什么选择Python和Matlab处理XJTU-SY轴承数据 轴承故障诊断是工业设备健康管理的重要环节,而XJTU-SY轴承数据集作为国内知名的公开数据集,包含了多种工况下的全寿命周期振动数据。面对这样的工程数据集,Python和Matlab各有优势。我在实际…...
别再写重复代码了!手把手教你用StringRedisTemplate搞定Shop-Type缓存(附完整代码)
告别重复劳动:基于StringRedisTemplate的Shop-Type缓存通用方案设计 在电商系统开发中,店铺分类(Shop-Type)这类基础数据的缓存处理几乎每个项目都会遇到。许多开发者习惯在每个Service中重复编写相似的缓存逻辑——序列化、反序列化、缓存判空、数据库回…...
GAMES201实战:5分钟搞懂快速多极展开(FMM)在静电模拟中的应用
GAMES201实战:5分钟搞懂快速多极展开(FMM)在静电模拟中的应用 当你在游戏引擎中设计一个带电粒子系统时,是否遇到过这样的困境:随着粒子数量增加,计算速度呈指数级下降?传统N体问题计算需要处理每个粒子间的相互作用&a…...
HAL库定时器双杀技:STM32F401CCU6同时实现PWM输出+输入捕获的避坑指南
HAL库定时器双杀技:STM32F401CCU6同时实现PWM输出输入捕获的避坑指南 在嵌入式开发中,定时器是最基础也最强大的外设之一。对于STM32F4系列微控制器,HAL库提供了丰富的定时器功能,但如何在同一芯片上同时实现PWM输出和输入捕获&am…...
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准
CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准 想象你是一位冰淇淋品鉴师,需要将一家老牌店铺(源域)的配方迁移到新店铺(目标域)。传统方法粗暴混合所有原料,导致巧…...
【自动驾驶】从贝叶斯到卡尔曼:线性滤波的数学之美与实践之路
1. 贝叶斯概率:理解不确定性的语言 想象你正在雾天开车,前方隐约有个模糊的影子。你的大脑会快速判断:那可能是一个行人(60%概率),也可能只是路标(40%概率)。这种在不确定环境中做判…...
Flash闪存技术
1 Mask ROM Cartridges: ROM卡带, Character ROM (CHR ROM) and the Program ROM (PRG ROM). Both of them are Mask ROM. SRAM or EEPROM: game status saving. Moto 6502: 6502 -> ST7 -> STM82 HDD Low-level formatting 低级格式化历史:HDD一个完整扇区包…...
评一个典型的“数学可视化 + 计算机图形学入门”的优秀案例(C++精灵库3D案例)
这份代码和视频展示了一个非常典型的“数学可视化 计算机图形学入门”的优秀案例。它不仅仅是一段能运行的代码,更是一个将抽象数学公式转化为直观视觉艺术的教学演示。 以下是对该程序及视频的多维度评论: 1. 技术实现与图形学原理 这段代码虽然简短…...
OpenGL 3D项目避坑指南:从贴图资源获取到交互菜单设计,我的CPT205大作业复盘
OpenGL 3D项目避坑指南:从贴图资源获取到交互菜单设计 当第一次接触OpenGL 3D项目时,许多计算机图形学学习者都会陷入相似的困境——如何在有限时间内完成一个既美观又功能完整的作品?本文将以CPT205课程大作业为例,分享从资源获取…...
PasteMD助力程序员提效:代码片段/日志/报错信息一键转高亮Markdown
PasteMD助力程序员提效:代码片段/日志/报错信息一键转高亮Markdown 1. 引言:从杂乱文本到优雅文档的烦恼 你有没有过这样的经历?在技术讨论群里,同事发来一段报错日志,密密麻麻的堆栈信息挤在一起,看得人…...
