JMM是啥

JMM是一个抽象的概念,描述的是一种规范,定义了各个程序中变量的访问方式。 JMM规定,所有变量都存储在主内存中,主内存是共享区域,所有线程都可以访问,但是线程对变量的操作必须在工作内存中进行。

基本类型数据会直接存储在工作内存中 引用内存会存储在主内存中

重排序

编译器为了最佳的执行效率会对代码进行重编译,编译不会改变原程序的执行结果(单线程中)

JMM模型特征

原子性

可见性

有序性

引起的问题

在多线程中就会造成并发问题

如何解决

JMM提供了8种原子操作

lock 锁定

unlock 解锁

read 读取

load 载入

use 使用

assign 赋值

store 存储

write 写入

JMM对这八种指令的使用,制定了如下规则:

不允许read和load、store和write操作之一单独出现。即使用了read必须load,使用了store必须write

不允许线程丢弃他最近的assign操作,即工作变量的数据改变了之后,必须告知主存

不允许一个线程将没有assign的数据从工作内存同步回主内存

一个新的变量必须在主内存中诞生,不允许工作内存直接使用一个未被初始化的变量。就是怼变量实施use、store操作之前,必须经过assign和load操作

一个变量同一时间只有一个线程能对其进行lock。多次lock后,必须执行相同次数的unlock才能解锁

如果对一个变量进行lock操作,会清空所有工作内存中此变量的值,在执行引擎使用这个变量前,必须重新load或assign操作初始化变量的值

如果一个变量没有被lock,就不能对其进行unlock操作。也不能unlock一个被其他线程锁住的变量

对一个变量进行unlock操作之前,必须把此变量同步回主内存

对基本数据类型读写操作的原子性

Happen-Before(先行发生规则)

在常规的开发中,如果我们通过上述规则来分析一个并发程序是否安全,估计脑壳会很疼。因为更多时候,我们是分析一个并发程序是否安全,其实都依赖Happen-Before原则进行分析。   Happen-Before被翻译成先行发生原则,意思就是当A操作先行发生于B操作,则在发生B操作的时候,操作A产生的影响能被B观察到,“影响”包括修改了内存中的共享变量的值、发送了消息、调用了方法等。

Happen-Before的规则有以下几条

程序次序规则(Program Order Rule):在一个线程内,程序的执行规则跟程序的书写规则是一致的,从上往下执行。

管程锁定规则(Monitor Lock Rule):一个Unlock的操作肯定先于下一次Lock的操作。这里必须是同一个锁。同理我们可以认为在synchronized同步同一个锁的时候,锁内先行执行的代码,对后续同步该锁的线程来说是完全可见的。

volatile变量规则(volatile Variable Rule):对同一个volatile的变量,先行发生的写操作,肯定早于后续发生的读操作

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

线程中止规则(Thread Termination Rule):Thread对象的中止检测(如:Thread.join(),Thread.isAlive()等)操作,必行晚于线程中所有操作

线程中断规则(Thread Interruption Rule):对线程的interruption()调用,先于被调用的线程检测中断事件(Thread.interrupted())的发生

对象中止规则(Finalizer Rule):一个对象的初始化方法先于一个方法执行Finalizer()方法

传递性(Transitivity):如果操作A先于操作B、操作B先于操作C,则操作A先于操作C

java中 jmm,JMM(JAVA内存模型)相关推荐

  1. java和硬件交互_Java内存模型

    Java内存模型 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范,真实并不存在 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JM ...

  2. 详解 Java 中 4 种 I/O 模型

    同步.异步.阻塞.非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作.而在文件读取这件事儿上,可以有多种方式. 本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几 ...

  3. java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...

    展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...

  4. Java中一维数组的内存解析(浅显易懂,新手必看)

    1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...

  5. Java中的正则表达式 - Java Regex示例

    Java中的正则表达式 - Java Regex示例 欢迎使用Java中的正则表达式.它在Java中也称为Regex.当我开始编程时,java正则表达式对我来说是一场噩梦.本教程旨在帮助您掌握Java ...

  6. java中static_认识java中的static

    图来源于百度 作者的废话:emm,早就想开始自己的博客生涯,不过只要一打开电脑,映入眼帘的就是一大堆杂乱的笔记,对于整理它们我是提不起丝毫的兴趣,奈何被生活所迫,只有开始我的第一篇杂文这样子来维持生活 ...

  7. java中 数组声明,java数组声明格式

    java 声明动态数组,java对象数组详解,java中声明数组,java数组声明格式 Java 中数组的声明一维数组的声明: 在 Java 中,数组是独立的对象,有自身的方法,不是变量的集合. 数组 ...

  8. Java中的记录器 - Java日志示例

    Java中的记录器 - Java日志示例 今天我们将研究Java中的Logger.Java Logger提供了java编程的日志记录. 目录[ 隐藏 ] 1 Java中的记录器 1.1 Java Lo ...

  9. Java中apple导入那个包_在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是()。A.java.appletB.java.awtC.j...

    在Java中,由Java编泽器自动导入而无需在程序中用import导入的包是().A.java.appletB.java.awtC.j 更多相关问题 问卷星是一个专业.无限制的免费在线问卷调查.测评. ...

  10. modeler java堆空间,JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

最新文章

  1. End Credits
  2. ubuntu-make/makefile/cmake
  3. 【Android 安装包优化】p7zip 源码交叉编译 Android 平台可执行程序 ( 下载 p7zip 源码 | 交叉编译 Android 中使用 7z 可执行程序 )
  4. DWORD dwSendTime =::GetTickCount();
  5. 弹性服务器怎么上传文件,上传哪个文件夹弹性云服务器
  6. 干货!几招教你降低论文重复率!!
  7. BEGIN-1 A+B问题
  8. 【Spark】SparkStreaming的应用及其原理
  9. Oracle数据库有哪几种启动方式
  10. minecraftjava版光追_我的世界:网易版终于更新狐狸生物?Java版光追技术已开始测试?...
  11. poi导出xlsx文件后,打开报“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决方法
  12. python里end的用法_python不换行之end=与逗号的意思及用途
  13. 甘特图控件VARCHART XGantt,解读活动组布局的“单独行中的节点”选项!
  14. ddl是什么意思网络语_DDL是什么意思?DDL跟数据库关系介绍 常见的DDL语句分享...
  15. 神经网络基础之激活函数
  16. 目前以太网主要采用什么连接计算机,目前以太网主要采用______连接计算机,计算机能够独享带宽...
  17. 软件测试怎么做?靠谱第三方软件测评公司有哪些?
  18. MS SQL 2005 32/64位下载
  19. python ppt转pdf macos_如何在 macOS 上一键批量把 PPT 和 Word 文件转成 PDF
  20. 网络摄像机显示管理服务器离线,有看头为什么总是离线 摄像头网络异常解决方法...

热门文章

  1. js 生成条码和打印
  2. ERD Online 4.0.3数据库在线建模(免费、更美、更稳定)
  3. 呼叫中心坐席功能在职场中的应用
  4. 2022年湖南省临床执业医师考试二单元随机真题
  5. 图像处理(3):深度学习之图像分类(垃圾分类案例)
  6. H5手机休闲游戏开发商有哪些?带你看遍北京游戏研发公司
  7. SQL Server 定时自动备份和自动删除方法图文超详细步骤
  8. flv.js php,flv.js的使用详解
  9. HashMap初始化长度设置大小
  10. 服务器内存2rx4是什么意思_云主机服务器内存(服务器内存1rx4和2rx4)