当前位置: 首页 > news >正文

完整教程:【JVM】详解 Java内存模型(JMM)

Java内存模型(Java Memory Model,JMM)

用来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。就是Java内存模型(Java Memory Model,JMM)

Java内存模型的主要目的是定义程序中各种变量的访问规则即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节

对于变量的存储与操作,JMM规定了主内存((Main Memory)和工作内存(Working Memory,与处理器高速缓存类比)​两种内存:

Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存​,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的数据

JVM定义了八种原子性的处理:

  • 锁定(lock): 作用于主内存中的变量,将他标记为一个线程独享变量。
  • 解锁(unlock): 作用于主内存中的变量,解除变量的锁定状态,被解除锁定状态的变量才能被其他线程锁定。
  • read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作启用。
  • load(载入):把 read 操作从主内存中得到的变量值放入工作内存的变量的副本中。
  • use(使用):把工作内存中的一个变量的值传给执行引擎,每当虚拟机遇到一个采用到变量的指令时都会使用该指令。
  • assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行该操作。
  • store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的 write 处理启用。
  • write(写入):作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中。

volatile关键字

当一个变量被定义成volatile之后,它将具备两项特性:

  • 第一项是保证此变量对所有线程的可见性。这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。
  • 第二个特性是禁止指令重排序优化。普通的变量仅会保证在该方式的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值管理的顺序与程序代码中的执行顺序一致。

volatile关键字在Java中关键凭借内存屏障来禁止特定类型的指令重排序。

1)写-写(Write-Write)屏障

在对volatile变量执行写操作之前,会插入一个写屏障。这确保了在该变量写操作之前的所有普通写操作都已完成,防止了这些写操作被移到volatile写操作之后。

2)读-写(Read-Write)屏障

在对volatile变量执行读操作之后,会插入一个读屏障。它确保了对volatile变量的读管理之后的所有普通读操作都不会被提前到volatile读之前执行,保证了读取到的资料是最新的。

3)写-读(Write-Read)屏障

最重要的一个屏障,它发生在volatile写之后和volatile读之前。这个屏障确保了就是这volatile写操作之前的所有内存操作(包括写管理)都不会被重排序到volatile读之后,同时也确保了volatile读管理之后的所有内存操作(包括读操作)都不会被重排序到volatile写之前

原子性、有序性、可见性

1)原子性

Java内存模型来直接保证的原子性变量运行包括read、load、assign、use、store和write这六个,可以大致认为,基本数据类型的访问、读写都是原子性的。

2)有序性

Java应用中的有序性许可总结为一句话:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。

3)可见性

可见性就是指当一个线程修改了共享变量的值时,其他线程能够立即得知这个修改。除了volatile之外,Java还有两个关键字能搭建可见性,它们是synchronized和final。synchronized完成可见性的原因是unlock之前必须将执行的结果同步到主内存中。

Happens-Before

通过它是判断数据是否存在竞争,线程是否安全的非常有用的手段。依赖该原则,我们能够通过几条简单规则一揽子解决并发环境下两个操作之间是否可能存在冲突的所有障碍,而不需要陷入Java内存模型苦涩难懂的定义之中。

程序次序规则(Program Order Rule)在一个线程内,按照控制流顺序,书写在前面的操控先行发生于书写在后面的操控。注意,这里说的是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。

管程锁定规则(Monitor Lock Rule)指时间上的先后。就是:一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是“同一个锁”​,而“后面”

volatile变量规则(Volatile Variable Rule)指时间上的先后。就是:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”同样

线程启动规则(Thread Start Rule):Thread对象的start()方法先行发生于此线程的每一个动作。

线程终止规则(Thread Termination Rule)否已经终止执行。就是:线程中的所有操作都先行发生于对此线程的终止检测,大家可以通过Thread::join()办法是否结束、Thread::isAlive()的返回值等手段检测线程

线程中断规则(Thread Interruption Rule):对线程interrupt()手段的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread::interrupted()方法检测到是否有中断发生。

对象终结规则(Finalizer Rule):一个对象的初始化完毕(构造函数执行结束)先行发生于它的finalize()手段的开始。

传递性(Transitivity):要是操作A先行发生于管理B,执行B先行发生于操作C,那就可以得出操作A先行发生于执行C的结论。

注意

时间先后顺序与先行发生原则之间基本没有因果关系,因而我们衡量并发安全困难的时候不要受时间顺序的干扰,一切必须以先行发生原则为准!

时间上的先行发生不代表这个执行一定是先行执行的,反之也不成立。

private int value = 0;
pubilc void setValue(int value){this.value = value;
}
public int getValue(){return value;
}

假设线程A先调用setValue(1)途径,线程B调用getValue()方式,线程B是否能得到理想的结果呢?

由于不是在同一个线程内,程序次序规则是不适用的,将上述所有的规则带入也发现没有一个成立的,因此是无法确定线程B的执行结果的,也就是说这是线程不安全的。

http://www.jsqmd.com/news/355376/

相关文章:

  • 2026年新角色:暗数据挖掘首席官的崛起——软件测试从业者的机遇与挑战
  • 北京上门回收名家字画|丰宝斋专业鉴藏,上门护航,守护藏品价值 - 品牌排行榜单
  • 2026必备!8个一键生成论文工具测评:专科生毕业论文+开题报告高效写作指南
  • AR虚拟形象赋能软件测试开发者IP:2026元宇宙营销战略
  • 2026年自媒体文案去AIGC痕迹:让AI写的内容更真实
  • Vue3+java基于springboot框架的船舶物料供应商交易平台的设计与实现
  • SW零件绘制之倒角和上色
  • 2026年硕博论文去AIGC痕迹攻略:达到10%以下的方法
  • 告别期刊退稿内耗✨虎贲等考AI合规赋能,新手也能写出可投稿级论文
  • Vue3+java基于springboot框架的课程互助学习系统
  • 2026年知网维普万方都能过的去AIGC痕迹方法
  • 反传统导航APP,摒弃只推荐最快路线,支持个性路线推荐,比如用户喜欢逛小店,推荐有特色小店的路线,用户带孩子,推荐有母婴室,卫生间的路线,不止看速度
  • 论文省心了!10个降AI率工具测评:MBA必看的降AI率工具推荐与对比
  • Qt——事件简单介绍
  • 写作小白救星 AI论文网站 千笔 VS 万方智搜AI,本科生首选!
  • Windows安装PostgreSQL
  • PHP代碼審計
  • 2026最新彩色胶企业top5推荐!国内优质彩色胶品牌权威榜单发布,资质服务双优助力高品质建材应用 - 品牌推荐2026
  • 2026冲刺用!10个一键生成论文工具测评:本科生毕业论文+开题报告高效写作指南
  • 控制算法研发工程师(博士)职位深度解析与面试指南
  • 2026年灯具品牌性价比排行(第三方实测版) - GEO排行榜
  • 摆脱论文困扰! 8个降AI率软件降AIGC网站测评:继续教育必备工具推荐
  • 深度解析:上海德梅柯汽车装备制造有限公司机器人工程师职位——技术核心、挑战与职业发展
  • 为什么制造运营管理系统必须采用语义驱动,而不能采用自然语言驱动
  • Vue3+java基于springboot框架航班售票飞机订票系统的设计与实现
  • 电子学会青少年机器人技术(五级)等级考试试卷-实际操作(2025年12月)
  • 电子学会青少年机器人技术(四级)等级考试试卷-实际操作(2025年12月)
  • Vue3+java基于springboot框架高校学生实习综合服务平台设计与实现
  • 2026开年重磅社会现实题材短漫剧重磅来袭《消失的程序员》
  • 如何在Navicat Premium中创建一个数据库?