JAVA内存模型—JMM

简述Java内存模型(JMM) 现代计算机模型与缓存一致性 现代计算机模型 现代计算机模型是基于冯诺依曼计算机模型,这里解释一下他的主要理论: 程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作模型。也就是说计算机再运行时,先从内存中取出一条指令(这里的内存可以理解为计算机的运行内存,也就是内存条),通过控制器的译码,按照指令要求,从存储器取出数据进行运算和逻辑操作,然后将结果写入内存中,然后反复这些操作。 上图就是冯诺依曼计算机模型。这里的存储器就是内存条,... 阅读详情
在今天和明天之间,有一段很长的时间;趁你还有精神的时候,学习迅速地办事。 —— 歌德
在介绍java内存模型之前,先提出一个问题,如何保证一个线程看到的数据是正确的?大家可能认为这个问题很没有意思,很简单,在一个线程里,程序都是串行化执行的,你读取到的数据肯定是正确的。现在,我们讨论的是多线程,在多线程里,数据的一致性就变得比较复杂了。
JAVA虚拟机规范定义了一种JAVA内存模型,来实现Java程序在各种平台都能达到一致的内存访问效果。在JDK1.5发布之后,Java内存模型已经变得成熟和完善起来了。JMM主要围绕多线程的原子性、可见性、有序性来建立。
我们首先了解一下这些概念。
原子性:一个操作是不可以中断的。表示即使是在多线程中,一个操作一旦开始,就不会被其它线程所干扰。大部分基本数据类型都具有原子性,但是有两个是例外的,long、double(64位),在32位的操作系统中,它们分为两次读写,如果多个线程对它们进行读写操作,可能会导致读取结果天差地别,我们可以使用volatile保证原子性。另外,sychronized也能保证原子性。
可见性:可见性是指当一个线程修改了共享变量时,其它线程能够立即发现这个修改。可见性主要体现在多线程程序中,单线程是不存在可见性问题的。在java内存模型中,一个线程修改共享变量后,会把修改后的值同步到主内存中,其它线程在读取值时,先从主内存刷新值到工作内存,实现可见性。在多线程中,普通变量不能保证可见性,因为变量的修改可能没有立即同步到主内存中,我们可以使用volatile、synchronized实现这一点。
有序性:有序性可以理解为代码的执行是从先往后,依次执行的。在单线程中,所有的代码都是串行化执行,是有序的。在多线程中,并不能体现有序性,Java虚拟机在对代码进行优化的时候,可能进行指令重排,导致执行顺序不一致。指令重排,是无法预测的,我们只需要记住,Java虚拟机指令重排进行优化,只能保证串行语义一致,并不能保证多线程间的语义也一致。volatile、sychronized可以实现代码的有序性。
当我们了解到这三个基本概念之后,大家有没有觉得sychronized好像是万能的。当然,大部分的并发控制都可以使用sychronized来实现,但是,正是因为它的万能,导致程序员对它非常依赖,在编程的时候没有思考,应当如何高效的实现并发控制,这是后话,略过。另外,我们还需要注意一点,volatile只能保证可见性和有序性,并不能保证原子性,要想完全的保证原子性,我们还是需要使用sychronized或java.util.concurrent中的原子类。
如果程序中,所有的代码我们都使用volatile、sychronized来实现有序性,那么,一些操作可能变得很烦琐。大家平常可能并没有使用这两个关键字,但是也能保证大部分代码的有序性,这是因为JAVA内存模型中定义了一个先行发生(happens-before)原则,下面我们来具体说一下有哪些happens-before原则:
>程序次序规则:一个线程内保证语义的串行性,书写在前面的操作先行发生于书写在后面的操作。
>volatile规则:volatile变量的写操作先行发生于读操作,保证了volatile变量的可见性。
>锁规则:一个unlock操作先行发生于后面对同一个锁的lock操作。注意,是针对的同一个锁。
>传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A一定先于操作C执行。
>线程启动规则:线程的start()方法先于此线程的每一个动作。
>线程终止规则:线程中的所有操作都先行发生于线程的终止。
>线程中断规则:线程的中断先于被中断线程的代码。这里可以理解为,对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测是否线程中断。
>对象终结规则:一个对象的初始化完成先行发生于它的finalize()方法的开始。finalize()方法在对象销毁前执行。
Java代码无需使用任何同步操作就能使用上面的规则。
在这里,围绕原子性、可见性、有序性,简单的介绍了Java内存模型,如果大家认为有不对的或者需要改进的地方,望帮忙指正,大家共同学习,一起进步。


OAI骨关节炎数据集申请与DICOM下载全流程避坑指南 医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性 阅读详情

相关推荐

GN算法边介数计算优化指南:如何提升大规模社交网络分析效率

本文深入探讨了GN算法在大规模社交网络分析中的核心瓶颈——边介数计算,并提供了从算法优化到工程部署的完整性能提升方案。通过引入Brandes算法、并行计算、增量更新及分布式处理等策略,有效解决了传统GN算法在处理百万级网络时效率低下的问题,为社交网络社区划分等实际应用提供了高效解决方案。

weixin_29196613的博客 486

Java 内存模型 JMM

Java 内存模型 JMM

26857259 1607

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具编写sgdc约束文件解决跨时钟域(CDC)报错问题。从基础语法到实战案例,涵盖时钟声明、复位约束、路径豁免等关键技巧,特别针对SPI断续时钟等特殊场景提供解决方案,并附常见错误排查指南,帮助工程师高效完成CDC验证。

weixin_28744423的博客 627

java内存模型JMM

java内存模型 jmm(java memory model)规范,他规范了java虚拟机与计算机内存如何协调工作 ,他规定了一个线程如何及何时看到其他线程修改过的变量的值,以及在必须时,如何同步的访问共享变量。 jmm内存分配的概念: 堆heap: 优点:运行时数据区,动态分配内存大小,有gc;,缺点:因为要在运行时动态分配,所以存取速度慢,对象存储在堆上,静态类型的变量跟着类的定义一起存储在...

坚定目标,超越自我 2万+

基于STM32与HRTIM的四开关Buck-Boost双向DC-DC电源设计实战(附源码、仿真与设计解析)

本文详细介绍了基于STM32F334的HRTIM高分辨率定时器实现四开关Buck-Boost双向DC-DC电源的设计实战。通过精准的PWM控制、双环PID算法和智能模式切换逻辑,解决了电压震荡与效率优化等关键问题,并提供了完整的源码、PSIM仿真及参数计算,为高性能电源设计提供了实用参考。

7z8x2c4v6b9的博客 299

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3679

聊聊Java内存模型(JMM)

它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。需要每个JVM 的实现都要遵守这样的规范,有了JMM规范的保障,并发程序运行在不同的虚拟机上时,得到的程序结果才是安全可靠可信赖的。Java内存模型围绕着在并发过程中如何处理这三个特性而建立的模型。

qq_25409421的博客 3万+

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 684

Java内存模型(JMM)

Java 内存模型(Java Memory Model),简称JMM。它定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。首先需要明白java的运行时数据区,如下图:​方法区:存储了运行时常量池、字段和方法参数、构造方法等字节码数据。堆:几乎所有的对象实例及数组都存在这里。栈:每一个线程有一个私有的栈,用于存储局部变量、栈帧、动态链接、方法出口等。本地方法栈:与栈类似,不过进入本地方法栈的数据需要通过native关键字表明。

xct5201314的博客 1757

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6103

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

perseverance51博客 2118

Java内存模型JMM

计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。 一般对于的程序的操作就是从数据库查数据到内存然后到CPU进行计算因为有这么多级的缓存(cpu和物理主内存的速度是不一致的) CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题JVM规范中试图定义一种Java内存模型(Java Memory Model,简称 JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM本

Lifelong learning 4032

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java 内存模型(JMM)

在面试中,Java 内存模型(Java Memory Model, JMM)是一个常见且重要的主题。然而,很多开发者容易将 JMM 与 Java 运行时内存区域混淆。本文将详细解释 JMM 的概念,并对比它与 Java 运行时内存区域的区别。

专注Java和MySQL领域知识分享 1058

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

Java内存模型(JMM)详解

为什么要有内存模型 在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调。 想要确保每个处理器在任意时刻知道其他处理器正在进行的工作,将需要很大的开销,且通常是没必要的。 硬件的效率与一致性 由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算...

牧小农 4510

【JMM】Java 内存模型

本期内容主要介绍JMM,Java内存模型。

爱编程爱运动的博客 4297

JMM(Java内存模型)详解

为了对上面的问题进行更深入的探究,我有查了一些JIT相关的资料。简单总结下JIT然后再对上面的问题分析下。JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一个关键组件,它负责在程序运行过程中动态地将字节码(即Java编译后的.class文件中的代码)转换为特定于平台的机器代码。这一过程旨在提高程序的执行效率,因为它能够针对运行时的数据和实际使用模式进行优化,而不仅仅是基于静态代码分析。JIT工作原理加载与解释执行:当Java程序启动时,JVM首先加载类文件并由解释器执行字节码。

落日的博客 4172

Java内存模型(JMM)深度解析

Java内存模型(JMM)是Java并发编程的核心规范,定义了多线程环境下变量访问规则和线程交互机制。JMM采用主内存与线程工作内存的抽象模型,通过8种原子操作控制内存交互,并建立happens-before原则保证操作顺序性。文章详细解析了内存屏障的实现差异、final字段的特殊规则、双重检查锁定的解决方案,以及JMM与硬件内存模型的关系。同时提供了可见性问题、指令重排序等常见并发问题的分析,并给出安全发布模式和性能优化建议。理解JMM是编写正确高效并发程序的关键,它既保证了线程安全,又为JVM优化提供了

weixin_47242663的博客 1272

Java内存模型之JMM

现代计算机系统中,CPU的运行并不直接操作主内存,而是通过将主内存中的数据加载到处理器的高速缓存中进行快速访问和运算。这种设计可以加快数据访问速度,提高计算效率。然而在多核处理器系统中,每个处理器核心都拥有自己的高速缓存,而它们又需要共享同一块主内存。当多个处理器核心同时对同一内存区域进行操作时,由于各自的高速缓存可能包含不一致的数据,就会出现数据一致性的问题。为了解决这个问题,就需要制定一套缓存一致性协议,确保各个处理器核心在操作缓存时能够遵守协议,从而保证数据不会出现混乱的情况。

weixin_54225397的博客 963

jmm-java内存模型

JMM-java内存模型

Java学习 1249

Java内存模型(JMM)详解

Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

EverythingAtOnce的博客 1996

揭秘Java内存模型(JMM)

简单来说,Java内存模型(JMM)是Java虚拟机(JVM)规范中定义的一种。

guangzhi0633的专栏 1121

java内存模型 JMM详解

什么是JMM模型 JMM是一种抽象的概念,并不真实存在,是一组规范或者规则;关注的是多个线程对共享内存空间和线程私有工作空间的访问方式,围栏并发的原子性、有序性、可见性来展开的,想要了解JAVA的并发编程,就应该理解JMM。 JMM通过定义了对变量(包括实例成员、静态成员和组成数组对象的元素)的访问方式,在程序运行时,运行程序的是实体是线程,每个线程创建时候,虚拟机都会为每个线程分配一定的内存空间,每个线程的内存空间用来存储线程私有的数据。但是JMM中规定数据都是存储在共享的主内存空间,而且每个线.

Angus 1383

Java内存模型(JMM)详解!

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JMM可以理解为是一个规范,一个抽象概念,并不真实存在。

追寻心的步伐 1717

JMM(Java 内存模型)

JMM(Java 内存模型) 主要定义了对于一个共享变量,当另一个线程对这个共享变量执行写操作后,这个线程对这个共享变量的可见性。JMM并不真实存在,它是一种规范,规定了程序中变量在内存中的访问方式。

SRY12240419的博客 1250
上一篇: 阻塞和非阻塞
下一篇: 线程是什么
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值