千家信息网

如何掌握Java并发内存模型

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容介绍了"如何掌握Java并发内存模型"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录1、J
千家信息网最后更新 2026年11月04日如何掌握Java并发内存模型

本篇内容介绍了"如何掌握Java并发内存模型"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 1、Java内存模型

  • 2、硬件内存架构

  • 3、实际执行

    • 3.1 共享对象可见性

    • 3.2 竞争条件

Java是一门支持多线程执行的语言,要编写正确的并发程序,了解Java内存模型是重要前提。而了解硬件内存模型有助于理解程序的执行。

本文主要整理以下内容

  • Java内存模型

  • 硬件内存架构

  • 共享对象可见性

  • 竞争条件

1、Java内存模型

Java内存模型最新修订是在Java5。 JSR-176 罗列了 J2SE5.0 相关发布特性,包含其中的 JSR-133(JavaTM内存模型与线程规范),java虚拟机遵循此规范。延续至今该内存模型在Java8中依然奏效。

JSR 全称 Java Specification Requests,意为Java标准化技术规范的正式请求。

Java程序运行在虚拟机上(Jvm)。从逻辑角度看,Jvm内存被划分为线程堆栈和堆。每个线程都拥有自己的堆栈,该线程堆栈存储的数据不对其它线程可见。堆内存用于存储共享数据。

线程堆栈存储方法中所有局部变量,包含原始类型(boolean,byte,short,char,int,long, float,double)和对象引用。

堆存储需要共享对象和静态变量。

注意:对象不一定都会存储到堆内存。看下面例子,假如果Object对象不需要被其它线程共享,编译器会执行堆分配转化为栈分配。

解释一下,编译器会根据对象是否逃逸做出优化。优化的其中一项就是堆分配转化为栈分配,目的在于减轻GC压力,提升性能。此优化动作由Jvm参数-XX:+DoEscapeAnalysi 进行控制。Java8 默认开启。

测试:通过开启或关闭 -XX:+PrintGC -XX:-DoEscapeAnalysis 观察是否执行GC来判断对象存储位置。

public static void main(String[] args){     for(int i = 0; i < 10000000; i++){         createObj();     } } public static void createObj(){     new Object(); }

2、硬件内存架构

如下图,现代计算机通常都装有2个或者更多的CPU,CPU又可以是多核。一个CPU包含一组寄存器,每个CPU具有一个高速缓存,而高速缓存又分为L1,L2,L3,L4 不同层级缓存。

RAM为主存储也就是我们说的计算机内存,所有CPU都可以读取主存储。

当CPU读取主存储数据时,它会将部分主存储数据读入CPU高速缓存中,又将缓存的中一部分读入寄存器执行,操作结束后,将值从寄存器刷新到高速缓存中,高速缓存在特定的时刻将数据统一刷新到内存中。

3、实际执行

事实上,上面阐述的Java堆栈内存模型是为了理解抽象出来的。实际执行就像下图一样,线程栈和堆的数据可能分散到硬件不同的存储区域。数据分散在不同区域会带来以下两个主要问题。

3.1 共享对象可见性

下面场景两个线程同时操作对象obj.count,其中一个线程对obj.count进行更新,但是对其它线程不可见。

线程A操作obj时,先从主存里拷贝一个数据副本到CPU高速缓存,又到寄存器,然后修改obj.count=2后刷新到CPU高速缓存,但是数据暂未同步到主存。以此同时线程B也操作obj,拷贝的数据副本仍然为obj.count=1,这会导致程序结果错误。

解决此问题,可以使用Java volatile关键字。volatile可简单理解为跳过CPU高速缓存,让修改结果及时同步到主存,从而保证了其它线程读到最新值。volatile 后期专门介绍。

3.2 竞争条件

另外一种情况假如果多个线程同时更行obj.count,这时会发生竞争条件。

解决方法,使用Java synchronized 保证线程执行顺序,另外synchronized包裹中的所有变量都直接从主存读取(跳过CPU高速缓存),并且当线程退出synchronized后,所有更新的变量将同步到主存。

"如何掌握Java并发内存模型"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内存 线程 模型 缓存 存储 对象 数据 高速 主存 堆栈 硬件 变量 实际 寄存器 条件 程序 分配 竞争 不同 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 互联网与科技 广州大一互联网络科技有限公司 互联网科技卖菜 天津摩尔互联网科技 互联网前沿科技 老年人脱离互联网科技的作文 开启互联网科技时代小说 剑昆互联网络科技有限公司临桂 互联网大会黑科技排名 辽宁互联网新科技 广州市恰铎互联网科技有限公司 亳州好赞互联网科技有限公司 工业互联网展湾科技股份有限公司 互联网科技圈年度人物 云鲸互联网络科技有限公司 青岛易易互联网科技 黑龙江互联网科技公司 安徽九吞吴互联网科技有限公司 武汉亿视互联网科技有限公司 互联网科技媒体 深圳前海聚择互联网科技有限公司 互联网时代科技改变生活 南山科技园互联网公司有哪些 广州恒生互联网科技有限 民营互联网公司国防科技 群盈汇互联网科技有限公司 国大互联网教育科技有限公司薪资 互联网第三次科技革命特征 互联网科技大会大佬
0