Java 内存模型之总结

Java内存模型 Java 内存模型规定了 Java 虚拟机如何与计算机内存 (RAM) 协同工作。Java 虚拟机是整个计算机的模型,因此该模型自然包含一个内存模型,也就是 Java 内存模型。如果你想设计出性能良好的并发程序,理解 Java 内存模型至关重要。Java 内存模型规定了不同线程如何以及何时可以访问其他线程写入共享变量的值,以及如何在必要时同步对共享变量的访问。原始的 Java 内存模型存在不足,因此 Java 1.5 中对 Java 内存模型进行了修订。 阅读详情

http://www.iocoder.cn/JUC/sike/jmm-4-summary/

经过四篇博客阐述,我相信各位对 Java 内存模型有了最基本认识了,下面 LZ 就做一个比较简单的总结。

1. 总结

老艿艿:此处的总结,内容上不是完全线性的,而是一些概念、原理等等关键点。

JMM 规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。

  • 一方面,要为程序员提供足够强的内存可见性保证。
  • 另一方面,对编译器和处理器的限制要尽可能地放松。JMM 对程序员屏蔽了 CPU 以及 OS 内存的使用问题,能够使程序在不同的 CPU 和 OS 内存上都能够达到预期的效果。

Java 采用内存共享的模式来实现线程之间的通信。编译器和处理器可以对程序进行重排序优化处理,但是需要遵守一些规则,不能随意重排序。

在并发编程模式中,势必会遇到上面三个概念:

  • 原子性:一个操作或者多个操作要么全部执行要么全部不执行。
  • 可见性:当多个线程同时访问一个共享变量时,如果其中某个线程更改了该共享变量,其他线程应该可以立刻看到这个改变。
  • 有序性:程序的执行要按照代码的先后顺序执行。

JMM 对原子性并没有提供确切的解决方案,但是 JMM 解决了可见性和有序性,至于原子性则需要通过锁或者 synchronized 来解决了。

如果一个操作 A 的操作结果需要对操作 B 可见,那么我们就认为操作 A 和操作 B 之间存在happens-before 关系,即 A happens-before B 。

happens-before 原则,是 JMM 中非常重要的一个原则,它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们可以解决在并发环境下两个操作之间是否存在冲突的所有问题。JMM 规定,两个操作存在 happens-before 关系并不一定要 A 操作先于B 操作执行,只要 A 操作的结果对 B 操作可见即可。

在程序运行过程中,为了执行的效率,编译器和处理器是可以对程序进行一定的重排序,但是他们必须要满足两个条件:

  1. 执行的结果保持不变
  2. 存在数据依赖的不能重排序。重排序是引起多线程不安全的一个重要因素。

同时,顺序一致性是一个比较理想化的参考模型,它为我们提供了强大而又有力的内存可见性保证,他主要有两个特征:

  1. 一个线程中的所有操作必须按照程序的顺序来执行。
  2. 所有线程都只能看到一个单一的操作执行顺序,在顺序一致性模型中,每个操作都必须原则执行且立刻对所有线程可见。

2. 博文列表

  1. 《【死磕 Java 并发】—– Java 内存模型之 happens-before》
  2. 《【死磕 Java 并发】—– Java 内存模型之重排序》
  3. 《【死磕 Java 并发】—– Java 内存模型之分析 volatile》
  4. 《【死磕 Java 并发】—– Java 内存模型之从 JMM 角度分析 DCL》

3. Java内存模型推荐资料

  1. 程晓明:《深入Java内存模型》

    老艿艿:自己和蛮多朋友都看过,必读!!!另外,这本小书也被整理到了 《Java 并发编程的艺术》 的 「3. Java 内存模型」 章节。

  2. 周志明:《深入理解 Java 虚拟机》 的 「第五部分 高效并发」

  3. 《Java 并发编程:volatile 的使用及其原理》
  4. 《Java并发编程:volatile 关键字解析》
  5. 《聊聊高并发(三十三)Java 内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型》
  6. 《聊聊高并发(三十四)Java 内存模型那些事(二)理解 CPU 高速缓存的工作原理》
  7. 《聊聊高并发(三十五)Java 内存模型那些事(三)理解内存屏障》
  8. 《聊聊高并发(三十六)Java 内存模型那些事(四)理解 happens-before 规则》
  9. 《happens-before 俗解》
JVM内存模型与Java线程内存模型的区别 总的来说,JVM内存模型和Java线程内存模型是Java程序运行时的两个重要方面,它们共同构建了一个稳定、高效的Java运行环境。JVM内存模型提供了整体的框架,而Java线程内存模型则在多线程情境下保证了数据的正确性和可见性。它是线程私有的,随着线程的创建而创建,随着线程的销毁而销毁。JVM内存模型主要关注Java程序在运行时的内存组织,而Java线程内存模型关注多线程环境下的数据共享和同步机制。JVM内存模型是整个Java虚拟机的内存结构,而Java线程内存模型则是在多线程环境下对内存的一种抽象。 阅读详情

相关推荐

定时移动鼠标点击鼠标,防止电脑息屏的vba脚本

定时移动鼠标,使系统始终处于激活状态,防止系统息屏。

panfei263031的博客 5927

jvm内存模型和java内存模型

初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、...

番茄炒土豆的博客 9444

IST——In-System-Test

安全性是自动驾驶平台的关键特性之一,而这些架构中使用的半导体芯片必须保证ISO 26262标准所要求的功能安全方面。为了监控由于现场缺陷导致的故障,在启动和/或关闭期间会自动运行系统内结构测试。当系统内测试(IST,In-System-Test)架构检测到任何永久性缺陷时,驾驶平台会做出响应,以实现系统的故障安全状态。汽车IC采用高质量测试方法进行筛选,以实现接近零的DPPM(每百万缺陷部件)。即使在这样的高测试标准下,由于环境或操作条件的影响,在系统现场运行过程中仍可能出现可靠性缺陷。

weixin_50518899的博客 3205

Java内存模型详解

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的一个,而且涉及到很多背景知识和相关知识。 网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚...

6143

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本,在安装Android Studio时遇到问题: Android Emulator Hypervisor Driver for AMD Processors installation failed. 笔记本配置为: 二、解决方案 2.1 开启CPU虚拟化 设置虚拟化的步骤这里不进行详细介绍了。如果需要,可以自行百

Wendy的博客 4万+

C#的GDI+绘图详解

/消除锯齿 或 AntiAlias。// 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象 ---- 控件或窗体重绘时。//为控件创建绘图对象。//--------------------以上方法三选一。//2.创建绘图对象 panel1中绘图。

weixin_50920631的博客 3457

java内存模型

java内存模型 下图就是java内存模型,但是一般讨论的时候不会画这个图,一般画的是java内存模型抽象结构图(在下文)。Thread Stack就是java内存模型抽象结构图中的本地内存,Heap就是java内存模型抽象结构图中的主内存。接下来介绍下图中两个线程内存分配的概念。 java里的堆是运行时的数据区,堆是由垃圾回收来负责的,堆的优势是可以动态的分配内存大小,生存期也不必事先告...

VRival的博客 4340

7、复杂分布式水文模型的两阶段代理参数校准框架

本文提出了一种针对复杂分布式水文模型的两阶段代理参数校准框架,旨在解决可变入渗能力模型(VIC)在参数校准过程中计算成本高、耗时长的问题。该框架结合AdaBoost与反向传播神经网络(BPNN)构建高精度代理模型,并引入ε-NSGA II多目标优化算法加速搜索最优参数集。通过在兰江流域和湘江流域的实验验证,该方法在校准效率上提升了约20倍,同时保持了高模拟精度(NSE接近1,Bias接近0)。框架采用两阶段设计:第一阶段(SM-I)快速筛选关键参数范围,第二阶段(SM-II)进行高精度预测,显著减少了无效计

apple5的专栏 86

CPU内存模型、Java内存模型和JVM内存模型

CPU内存模型、Java内存模型和JVM内存模型

qq_40577332的博客 1583

落地实战!Python构建地方政府公开数据爬虫:政策/数据/规划全维度抓取(附反爬适配+数据清洗)

政务公开数据爬虫的核心不是“技术多先进”,而是“适配政务网站的特性”——慢一点、稳一点、合规一点,比追求抓取速度更重要。多地市爬虫集群:通过配置文件管理不同地市的URL规则,实现全省/全国政务数据抓取;图片表格识别:结合OCR工具(如pytesseract)识别政务网站的图片表格,转换为结构化数据;数据可视化:将抓取的统计数据导入PowerBI/Matplotlib,实现区域发展趋势分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1797

【推荐100个unity插件之8】实现多人在线联机游戏——Mirror插件的使用介绍(附项目源码)

基于Mirror的Unity多人游戏开发指南 本文介绍了使用Mirror插件开发Unity多人游戏的基本流程。Mirror是Unity的高级网络API,替代了已废弃的UNet系统。文章详细讲解了如何导入Mirror插件,创建NetworkManager网络管理器,处理常见错误,以及创建玩家角色和出生点。 主要内容包括: 创建场景NetworkManager并配置必要组件 为玩家添加NetworkIdentity和NetworkTransform组件 设置玩家初始生成位置和生成方式 常见错误及解决方法 通过M

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你碰到了半吊子面试官,那就要恭喜你了。Java 内存模型比 JVM 内存结构复杂很多,Java 内存模型有一个规范叫:《JSR 133 :Java内存模型与线程规范》,里面的内容很丰富,如果你没看过的话...

平头哥的技术博文 2734

【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)

初始环境安装。

废人一枚的博客 5079

Java多线程之Java内存模型

在介绍Java内存模型之前,我们先介绍一下计算机硬件的内存模型,因为JVM的并发和物理机器的并发很相似,甚至JVM并发操作中很多设计都是因为计算机系统的设计引发的。 硬件的内存模型 大家都知道计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中,所以处理器在运算过程中不可避免的会涉及到与内存的读写交互,比如读取运算所需的数据,存储...

老胡 5704

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JVM内存模型和JAVA内存模型的区别

前言 很多人都以为JAVA内存模型就是JVM内存模式,其实二者是不同的概念,本文针对此,主要讲解JVM内存模型和JAVA内存模型的区别。 正文 其实本身二者就是不同的概念,在此我分开来讲。 JVM内存模型 JVM内存模式主要分为:程序计数器、JAVA虚拟机栈、本地方法栈、堆和方法区,其中JDK1.8之前方法区的实现为永生代,而JDK1.8之后方法区的实现转为元空间。 各个内存区域的作用在很多博客和...

Hpsyche的博客 2487

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

思考:Java内存模型和硬件内存模型

前一阵在看volatile的原理,看到内存屏障和缓存一致性,发现再往底层挖就挖到了硬件和Java内存模型。这一块是自己似懂非懂的知识区,我一般称之为知识混沌区。因此整理这一篇文章。什么是内存模型(Memory Model)呢?它是系统和程序员之间的规范,它规定了存储器访问的行为,并影响到了性能。并且,Memory Model有多层,处理器规定、编译器规定、高级语。

bigben 1099

JVM内存模型和java内存模型

1. JVM内存模型 Java 虚拟机在执⾏ Java 程序的过程中会把它管理的内存划分成若⼲个不同的数据区域。JDK1.8 和之前的版本略有不同,下⾯会介绍到。 首先对于一个进程来说,它包含多个线程,每个线程都有其独立的内存区域,包括:虚拟机栈,本地方法栈和程序计数器。 程序计数器:线程私有 记录当前线程所执行到的字节码的行号。 每个线程都有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存区域。 它是唯一没有OutOfMemoryError情况的内存区域。

m0_45861545的博客 6283

Java 的内存模型

Java 的内存模型 文章目录Java 的内存模型前言一、原子性、可见性、有序性二、java内存模型1.简述内存的物理结构2.gc内存模型虚拟机/本地方法栈3.并发内存模型4.JMM规范总结参考资料: 前言 在刚开始的地方我不认为先直接把模型给大家比较有意义,所以第一步我会先向大家介绍其最主要的三个特性。大家可能会认为这只是一种理论对其没有什么意义。那么我就会以一个问题来作为开头大家来进行仔细思考。在我们经常使用的i++是不是原子操作?他不是一个原子操作而是三个,但是我们为什么能实现其按顺序执行呢?那是

shshaohy的博客 811

JAVA内存模型与JVM内存模型的区别

** JAVA内存模型与JVM内存模型的区别 ** 直接进入正题 **JAVA内存模型: Java内存模型规定所有的变量都是存在主存中,每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行,不能直接堆主存进行操作,并且每个线程不能访问其他线程的工作内存。 Java内存模型的Volatile关键字,原子性、可见性、有序性 详情 *...

qq_37019196的博客 1万+

Java内存模型是什么

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文,就来整体的介绍一下Java内存模型,目的很简单,让你读完本文以后,就知道到底Java内存模型是什么,为什么要有Java内存模型,Java内存模型解决了什么问题等。本文中,有很多定义和说法,都是笔者自己理解后定...

hanjungua8144的博客 2764

Java内存模型与Jvm内存模型

经典问题 Q:说一下 Java(Jvm)的内存模型 A:Java内存模型是Jvm内存模型的抽象(深入理解JAVA虚拟机) JVM内存模型 线程安全--虚拟机栈、本地方法栈、程序计数器 非线程安全--方法区、堆(新生代,老年代)、 Meta Space(Jdk 1.8新增) Java内存模型 工作内存、主内存(对应JVM内存中的一部分) 追根溯源 Jvm内存模型 Java虚拟机运行时数据区 程序计数器:一块较小的内存空间,当前

chzh101011的博客 2740

JVM内存模型、Java内存模型

1、JVM内存模型(区别Java内存模型)   JVM内存主要分为:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。   1、程序计数器: 为了线程切换能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。计数器记录的是正在执行的虚拟机字节码指令的地址。   2、Java虚拟机栈: 每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接(例如多态就要动态链接以确定引用的状态)、方法出口等

qq_21010647的博客 277

Java内存模型是个啥?

Java虚拟机带来的Java内存模型,定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。Java内存模型规定了不同线程如何以及何时可以看到其他线程写入共享变量的值以及如何在必要时同步对共享变量的访问。每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存这里说的 主内存、工作内存 和Java中堆、栈、方法区不是同一个概念,这两者没有什么关系。

weixin_46575696的博客 960
上一篇: Java 内存模型之从 JMM 角度分析 DCL
下一篇: J.U.C 之 AQS:AQS 简介
god_love_hlq_xff
博客等级 码龄11年 27粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值