十分钟看Java基础:Java内存模型

Java多线程内存读写 —— 内存屏障的理解 在现代计算机中,CPU往往都是多核的,而由于每个CPU Core中都有自己的高速缓存Cache,因此就会造成内存数据读写的不一致性,表现为指令乱序与不可见性问题。为此,java为了统一物理世界中的计算机组成架构,提出了JMM内存模型,并抽象了LoadLoad,StoreStore,LoadStore,StoreLoad四个内存屏障指令来应对不同CPU的体系。本文先介绍下多核CPU体系下,并发编程需要克服的问题,然后再介绍下Java的内存屏障各自的含义,并举例说明对应的场景。 阅读详情

说明:本文的大部分内容参考和摘取了《Java并发编程艺术》这本书,对我来说也相当于做笔记吧。

一、 Java内存模型的基础

1. 总述

内存模型,我简单的理解就是Java在运行过程中的JVM对内存进行一系列操作的框架或者了流程(仅代表个人观点)。

在并发编程中,主要需要处理两个关键的问题:线程之间的通信、线程之间的同步。

2. 简介

说到Java的内存模型,就不得不和计算机的内存模型相联系起来了。

  1. CPU执行过程

大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道,而计算机上面的临时数据,是储存在主存中的。

计算机内存包括高速缓存和主存。

我们知道CPU执行指令的速度比从主存读取数据和向主存写入数据快很多,所以为了高效利用CPU,CPU增加了高速缓存(cache)来匹配CPU的执行速度,最终程序的执行过程如下:

  • 首先会将数据从主存中复制一份到CPU的高速缓存中

  • 当CPU执行计算的时候就可以直接从高速缓存中读取数据和写入数据

  • 当运算结束后,再将高速缓存的数据更新到主存中

(下图来源于电子书)
在这里插入图片描述

  1. Java执行过程(抽象结构)

所以,在Java内存模型中,也是类似的结构,如下图:
(下图来源于电子书)
在这里插入图片描述
所以可以知道:

Java内存模型(Java Memory Model,JMM) 即是Java语言对前面提到的——计算机解决多线程场景下的一个主存操作规范的遵循,JMM规定了所有的变量都存储在主存中,每个线程都有自己的工作区,线程将使用到的变量从主存中复制一份到自己的工作区,线程对变量的所有操作(读取、赋值等)都必须在工作区,不同的线程也无法直接访问对方工作区,线程之间的消息传递都需要通过主存来完成。可以把这里主存类比成计算机内存模型中的主存,工作区类比成计算机内存模型中的高速缓存。

然后通过Java内存模型,在多线程场景下访问主存保证 原子性、可见性、有序性。

二、 进一步了解Java内存模型

(一)重排序(为了优化、提升性能)

首先我们要知道重排序分三种类型:编译器优化重排序、指令级并行重排序、内存系统重排序。下面先简单说一下这三种不同维度的重排序:

  • 编译器优化重排序:这个是编译器在不改变单线程语义的前提下,可以重新安排语句的执行顺序。
  • 指令级并行重排序:多条指令重叠执行。
  • 内存系统重排序:对内存的加载和存储的顺序进行重新排序。

从Java源码到最后的指令序列的执行,都会经历上述的三种不同维度的重排序。

我们现在可以知道的是,重排序很直接的目的是提高计算机的性能,加快速度,但是有利也有弊。不对它进行一些特殊的处理,可能它带来的结果就不是我们期望的那样。
因此,我们就引出的下面的这些内容。

  1. 内存屏障

    为了保证内存的可见性,Java编译器在指令序列的适当位置会插入内存屏障指令,来禁止特定类型的处理器重排序。JMM 把内存屏障指令分成了 LoadLoad、LoadStore、StoreStore、StoreLoad 这4种。想要了解这四种内存屏障指令的具体内容的小伙伴,可以花点时间去看看。

  2. happens-before

    用于阐述操作之间的内存可见性。在JMM中,如果一个操作的执行结果需要对另一个操作可见(简单的说就是有影响吧),那么就会在两个操作之间必须存在一个happens-before的关系。

  3. as-if-serial: 不管怎么重排序,单线程程序的执行结果不能被改变

(二)顺序一致性内存模型

这是一个理论参考模型,在具体设计的时候会以此作为参考。它的两大特性:

  1. 一个线程中的所有线程操作必须按照程序的顺序来执行。(好像和重排序有些冲突了,不过这也是参考。毕竟有了参考就好下手了不是。)
  2. (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性模型中,每个操作都必须原子执行且立刻对所有线程可见。

三、 关键词的内存语义

(一)volatile

volatile原理

  • 由有volatile修饰的变量汇编代码中会多出Lock前缀的指令。
  1. Lock前缀指令会引起处理器缓存回写到内存。
  2. 一个处理器的缓存回写到内存会导致其他处理器的缓存无效。

volatile语义的实现

  • 使用到了上述的内存屏障,具体的去看书哦。

(二) 锁

从某种角度上看,也和 volatile 是一样的 —— 获取时获取最新,更改时刷新主存。

锁的实现

锁的实现涉及到的内容有点多,主要是CAS、AQS等知识。因为本篇的重点是Java的内存模型,所以就不再细说了。
后面应该还会专门写一篇关于Lock的文章,有兴趣的小伙伴可以去了解一下。

写在最后

文章的内容到这里就结束了,感谢你的观看。

如果你觉得文章对你来说有收获的话,可以给我点赞,这是对我坚持下去最大的激励。

如果想要获取最新发布的文章,不妨点个关注哦。

C++基础语法全解析:从内存模型到项目实战的硬核入门指南 在编程语言中,语法是构建程序的基石,它定义了代码的结构、逻辑和与计算机交互的规则。理解语法背后的原理,如内存模型、控制流和函数机制,是掌握一门语言的关键。这些基础概念直接决定了代码的性能、安全性和可维护性,具有极高的技术价值。无论是开发高性能系统、嵌入式设备还是游戏引擎,扎实的语法基础都是不可或缺的。本文聚焦于C++这门核心系统编程语言,深入剖析其基础语法体系。我们将从变量与数据类型背后的内存模型切入,探讨指针与引用这一C++的灵魂特性,并解析函数、控制流等核心要素。通过融入**列表初始化**避免窄化转换、 阅读详情

相关推荐

百度Java社招三面面经:从Java基础到系统设计全复盘

围绕Java工程师面试中的核心知识体系,从集合源码、并发编程、JVM内存管理到MySQL索引与Redis缓存一致性,深入解析高频考点背后的原理与工程实践。掌握HashMap与ConcurrentHashMap的底层实现、快速排序与冒泡排序的优化技巧,以及Spring Boot接口安全对接与幂等设计,是应对大厂技术面试的关键。从环境变量配置到OOM排查,从分布式事务到微服务拆分,系统化梳理Java开发者在真实业务场景中的技术选型与问题解决思路。结合百度社招三面真实经历,呈现从基础八股到系统设计、从算法手撕到综

weixin_30516429的博客 356

Java的内存屏障

一、为什么要有内存屏障 内存屏障是为了解决因为cpu,高速缓存,主内存出现的时候,导致的可见性和重序性问题。 1、原理解释 因为计算机的运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。但是在真正的实际开发中CPU是要与内存进行交互的,但因为内存和CPU的计算速度是有差距的,因此为了提高CPU的利用效率,现代处理器结构都加入了一层读写速度尽可能接近CPU运算速度的高速缓存来作为内存与CPU之间的缓冲:将运算需要使用的数据复制到缓存中,让CPU运算可以快速进行,计算结束

qq_48241564的博客 4250

2017年锐明Java笔试卷复盘:基础考点与面试避坑指南

Java程序员面试中,基础知识的考察从未过时。无论是校招还是社招,面试官都希望通过集合、并发、JVM等核心问题快速判断候选人的真实编码能力。以HashMap为例,其底层数据结构从数组链表到红黑树的演进,不仅涉及哈希冲突处理,更体现了对性能与空间利用率的权衡;而JVM内存区域划分与OOM场景分析,则是排查线上问题的必备技能。理解这些原理,不仅能应对笔试中的简答题,更能帮助开发者写出健壮的工程代码。从Java标识符陷阱到多线程安全实现,从冒泡排序的边界优化到快速排序的分治思想,每一个考点都是技术功底的试金石。本

weixin_34192816的博客 287

Java里面的四种内存屏障

volatile四种内存屏障

qq_48403611的博客 1119

基于Apache MINA SSHD配置及应用

Apache MINA SSHD是一个基于Java的开源SSH服务器/客户端实现,支持SSH2协议,提供文件传输、shell访问等功能。该代码实现了一个SftpClientService服务类,封装了SFTP文件操作,包括读取文件(readOnce/readLines)和写入文件(writeOnce)等核心功能。通过SftpProperties配置类管理连接参数,并采用Builder模式创建SSH会话。主要特点包括:支持大文件分块传输、自动创建目录、严格的异常处理和...

流沙QuickSand 945

基于STM32+OV7670的图像采集系统(基础篇:ov7670介绍)

一、简单认识 先来看一下外观: OV7670,图像传感器,体积小,工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输入整帧、子采样、取窗口等方式的各种分辨率8位影像数据。 其他介绍比较繁琐,这里就不一一赘述了,我们只需要知道它是通过SCCB总线控制的就行了。 带FIFO与不带FIFO 目前市场上购买的ov7670模块分为两种,一种是不带FIFO芯片、一种是带FIFO芯片的。 FIFO是什么:(First Input First Output)先入先出的意思,

m0_59113542的博客 4万+

Juc12_Volatile的可见性、不保证可见性、有序性、使用、内存屏障四大指令StoreStore、StoreLoad 、LoadLoad、LoadStore

https://tangzhi.blog.youkuaiyun.com/article/details/117601980?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117601980-blog-123595503.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant

yygr的博客 608

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 537

java内存栅栏,Java内存屏障(Memory Barriers)

内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。Java编译器也会根据内存屏障的规则禁止重排序。1.java内存屏障java 的内存屏障通常所谓的四种即LoadLoad、StoreStore、LoadStore、StoreLoad 。LoadLoad屏障:对于这样的语句Load1; LoadLoad...

weixin_31742467的博客 389

RPG MV游戏数据修改指南:从JSON解析到脚本进阶

游戏数据修改是游戏开发与逆向工程中的常见实践,其核心原理在于解析和操作游戏资源文件。许多现代游戏引擎采用结构化数据格式(如JSON)存储游戏配置,这为外部修改提供了可能。通过理解文件结构、数据格式与游戏逻辑的关联,开发者或爱好者可以调整游戏平衡、修复问题或实现个性化定制,这不仅能深化对游戏设计机制的理解,也具备实际的技术学习价值。本文以基于Web技术栈的RPG Maker MV(RPG MV)引擎为例,其游戏数据多以明文JSON存储,结构清晰。文章将具体阐述如何安全地修改角色属性、物品效果、敌人数据及技能公

weixin_29001419的博客 403

Python进行.tif格式数据波段组合;多波段tif数据波段分离

Python进行.tif格式数据波段组合;多波段tif数据波段分离.tif格式数据波段组合多波段.tif数据波段分离 阔别已久,我又来了;啊啊啊…… 读了研究生,忙到天昏地暗(哈哈哈,这都是借口,主要是花了一定时间适应研究生生活) 这方面的内容我也主要是应用在遥感领域,我们知道在遥感应用中,大多数的图像数据格式为.tif格式的。进行波段组合使用ArcGIS里面的Composite Bands工具是可以实现的,波段分离也可以使用一些工具或巧妙的方法分开。但当你使用Python程序的话,就可以简化这个软件点击和

qq_44353170的博客 1万+

十分钟吃透Java内存模型

Java内存模型 Java内存模型把Java虚拟机内部划分为线程栈和堆。这张图演示了Java内存模型的逻辑视图。 每个运行在JVM里的线程都拥有自己的线程栈。线程栈包含了该线程调用的方法的当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的局部变量对其它线程不可见,只对自己可见。即使两个线程执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建局部变量。因此,每个线程拥有每个局部变量的独有版本。 所有原始类型的局部变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递

神技圈子的博客 281

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

手撕并发编程:十分钟搞定Java内存模型

👉导读 随着硬件技术的飞速发展,多核处理器已经成为计算设备的标配,这使得开发人员需要掌握并发编程的知识和技巧,以充分发挥多核处理器的潜力。然而并发编程并非易事,它涉及到许多复杂的概念和原理。为了更好地理解并发编程的内在机制,需要深入研究内存模型及其在并发编程中的应用。本文将主要以 Java 内存模型来探讨并发编程中 BUG 的源头和处理这些问题的底层实现原理,助你更好地把握并发编程的内在机制,欢迎继续阅读。 👉目录 1 并发编程问题-可见性和有序性 2 并发编程问题-原子性 3 内存模型与 hap

共同学习、强我国家 136

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 552

Python 爬虫实战:爬取豆瓣读书评论并分析

摘要:本文以豆瓣读书《活着》评论数据为例,详细讲解Python爬虫开发与文本分析全流程。首先通过requests库爬取评论数据,解决分页、反爬等问题;然后利用BeautifulSoup解析页面提取评论内容、评分等核心信息;最后结合jieba进行关键词提取、snownlp完成情感分析,并通过可视化展示结果。分析显示该书评分以5星为主(占比70%),正面评论达82%,核心关键词为"活着""余华""生命"。全文包含完整代码与详细解析,帮助读者掌握非结构化

2503_91057718的博客 1497

什么是Java内存模型?

内容有点长,请花十分钟认真读,你会收获很多。 快读 在内存里,Java内存模型规定了所有的变量都存储在主内存(物理内存)中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行。不同的线程无法访问其他线程的工作内存里的内容。我们可以使用下图来表示在逻辑上 线程、主内存、工作内存的三者交互关系。 现在,我们都理解了缓存导致了可见性问题,编译优化导致了有序性问题。也就是说解决可见性和有序性问题的最直接的办法就是禁用缓存和编译优化。但是,如果只是简单的禁用了缓存和编译优化,那我们..

yanganbang880605的博客 869

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

漫画图解:小学生都能懂的JAVA内存模型

刚开始学多线程时,我总遇到一些“诡异”现象:明明代码逻辑没问题,但运行结果时对时错。点开就能看到动画演示,修改代码后实时生效,还能一键部署成可分享的网页——我测试时从开发到上线只用了不到十分钟。今天想和大家分享一个特别适合Java初学者的学习项目——用生活化比喻和互动小游戏来理解Java内存模型(JMM)。通过这种比喻,volatile关键字就很好理解了——它相当于给货物贴“必须实时更新”的标签,避免员工一直用旧库存。上开发的,完全不需要配置环境,打开就能运行,特别适合刚接触多线程的同学。

SnowflakeJaguar14的博客 599

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

十分钟深入理解volatile

个人觉得JUC里面的东西比JVM还要玄,JUC中将引领我们用一种多线程的角度思考整体的程序,可以说是一种挑战吧。 volatile,中文语义:不稳定的 大家都应该了解这个常识吧!(不知道的一定要记好) Java中,若一个变量会被多个线程所使用,我们需要给这个变量加上volatile关键字。 しかし!(但是)作为未来大厂高级电脑的附属品,我们必然不能只了解这个规则,更应该洞悉why,才能在未来的使用中,稳定起飞 一、首先,volatile到底是个啥? Java语言规范第3版中对volatile的定义如下.

可乐的博客 1207

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java代码执行流程,JVM内存模型

Java代码执行流程,JVM内存模型

qw2869534823的博客 485

Java最全2024JAVA互联网各大BATJ大厂(网易、华为、腾讯、阿里)笔经面经,Java程序员必备书籍

面试题文档来啦,内容很多,485页!由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

2301_79099287的博客 924

Java基础笔试考点全解析:从语法到并发JVM的备考路线

在Java技术栈的学习与求职过程中,扎实的基础知识是应对各类笔试面试的关键。从Java语法、面向对象设计,到集合框架、并发编程与JVM内存模型,每一个环节都直接影响代码质量与系统稳定性。HashMap的底层原理、ArrayList与LinkedList的适用场景、synchronized与Lock的取舍,以及OutOfMemoryError的排查思路,都是高频考察点。同时,Spring Boot的IoC/AOP机制、API安全对接与接口自动化测试,也逐渐成为工程能力考核的一部分。掌握这些核心概念,并配合冒泡

weixin_34238633的博客 387

java培训资料下载

前言 面试大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了。回来之后把这些题目做了一个分类并整理出答案(强迫症的我~狂补知识)分为MySQL+Java+Redis+算法+网络+Linux等六类,接下来分享一下我的这次阿里一面面经+一些我的学习笔记。 内存模型 内存模型定义为什么要有内存模型为什么要重排序,重排序在什么时候排如何约束重排序规则happens-before 什么是顺序一致性 CAS 实现的原理,是阻塞还是非阻塞方式?什么时候用,使用时需要考虑的问题 处理器和 Ja

m0_57285455的博客 148

Java实习生面试

5-18java实习生面试过程 本人投的是一家位于北京海淀的做农场品的中型互联网公司,面试没有通过,所以记录一下面试官问我的问题还有我反问面试官的一些问题。 面:先来一个自我介绍。 我:自我介绍背的模板,所以说的非常流畅。 面:你是非计算机专业?那我就问你一些计算机相关的东西吧,栈和队列有了解过吗? 我:栈我可以说出来,队列我给忘了,总共数据结构就学了栈和队列我还给忘了,气死我了。 面:二叉树有了解吗: 我:这个我就更不知道了。。。 面:在问一些比较常问的吧,说一下线程、进程、携程的区别。 我:进程,线程我

weixin_51412054的博客 1198

唯品会2019秋招Java开发A类试卷深度解析:基础考点与刷题策略

计算机基础是后端开发笔试的恒定主线,无论技术栈如何迭代,Java内存模型、并发编程的线程池参数、数据结构中的HashMap实现、数据库索引失效场景,以及TCP握手状态迁移,始终是校招高频考点。理解这些概念背后的原理——例如哈希冲突的泊松分布阈值、线程池的拒绝策略、B+树最左匹配原则——才能真正应对题目变形。技术价值在于,基础扎实的工程师能更快定位线上问题,并在高并发业务场景中做出合理取舍。从电商秒杀、订单查询到库存扣减,这些知识在真实业务中均有直接映射。唯品会2019秋招开发A类试卷恰是观察上述考点的典型样

weixin_34187862的博客 510
上一篇: h老板计网实验:ignite订正与理解
下一篇: 开发环境:VSCode配置Remote远程开发
CalesQ
博客等级 码龄8年 121粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值