目录

  • 简介
  • 三大特性
  • volatile关键字

简介

JMM内存模型,也称为Java多线程内存模型。它和cpu缓存模型类似,是基于cpu缓存模型来建立。
cpu缓存模型:

java内存模型:

当Java线程运行时会先从主内存中获取到数据,放到本线程的工作内存,在之后的运行中用到这些数据时会先从工作内存获取。如果这些数据失效了再从主内存获取,放到工作内存。

public class jmmtest_0 {private static boolean flag = true;public static void main(String[] args) {// TODO 自动生成的方法存根new Thread(new Runnable(){@Overridepublic void run() {// TODO 自动生成的方法存根while(flag) {}}}).start();try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}new Thread(new Runnable(){@Overridepublic void run() {// TODO 自动生成的方法存根System.out.println("转换前:"+flag);flag =false;System.out.println("转换后:"+flag);}}).start();}}

这段代码可以更好的理解上面所说,这段代码并不会停止,虽然主内存中更新了flag,但第一个线程用的flag是工作内存中的数据。

三大特性

可见性:

可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。

可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。

在 Java 中 volatile、synchronized 和 final 实现可见性。

原子性:

原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性。

有序性:

Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。

volatile关键字

在上述代码中的flag前面加上关键字volatile,程序就可以停止了。

public class jmmtest_0 {private static volatile boolean flag = true;public static void main(String[] args) {// TODO 自动生成的方法存根new Thread(new Runnable(){@Overridepublic void run() {// TODO 自动生成的方法存根while(flag) {}}}).start();
//      try {//          Thread.sleep(2000);
//      } catch (InterruptedException e) {//          // TODO 自动生成的 catch 块
//          e.printStackTrace();
//      }new Thread(new Runnable(){@Overridepublic void run() {// TODO 自动生成的方法存根System.out.println("转换前:"+flag);flag =false;System.out.println("转换后:"+flag);}}).start();}
}

此外也体现了volatile的可见性。

volatile缓存可见性实现原理:
底层实现主要是通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并写到主内存。

简单地说就是,当有volatile修饰的数据发生改变时,会立即写到主内存,并且给数据加上锁,同时通过缓存一致性协议使得其它线程工作内存中的该数据失效。这样其它线程只能到主内存中获取数据,并且只有在修改数据的线程成功将数据写到主内存后才能读取。

java——JMM内存模型相关推荐

  1. JUC进阶之路-Java的内存模型JMM

    本文源自转载:JUC进阶之路-Java的内存模型JMM 目录 一.大厂常见的JMM面试题 二.什么是JAVA内存模型JMM(Java Memory Model) 三.JMM的三大特性 3.1 可见性 ...

  2. JMM内存模型如何为并发保驾护航

    一.为何引入JMM 每个处理器在执行任务时,不可能单靠"计算"就可以完成所有任务,处理器至少需要和内存交互,进行读取运算数据.存储运算结果等,这个I/O操作是很难消除掉的.但由于计 ...

  3. JUC多线程:JMM内存模型与volatile内存语义

    一.JMM 内存模型: 1.什么是 JMM 内存模型: Java 内存模型是 Java 虚拟机定义的一种多线程访问 Java 内存各个变量的访问规范,主要围绕如何解决并发过程中的原子性.可见性.有序性 ...

  4. 最新详细的JMM内存模型(三天熬夜血肝)

    知识图谱 前言 网上并发以及JMM部分的内容大部分都特别的乱,也不好整理.花了三四天时间才整理了一篇,有些概念的东西,是需要了解的,也标注出来了. 标注:在学习中需要修改的内容以及笔记全在这里 www ...

  5. Java的内存模型,java初级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. JMM内存模型详解(一)

    本文开始死磕JMM(Java内存模型)由于知识点较多,分来写 该文为JMM第一篇 技术往往是枯燥的,本文文字较多 1. JMM是什么? 其实JMM很好理解,我简单的解释一下,在Java多线程中我们经常 ...

  7. 用volatile的视角,来打开JMM内存模型

    文章目录 [引言] 1. 多核并发缓存架构 CPU缓存 JMM内存模型简介 2. JMM内存模型验证 volatile验证内存模型 JMM内存模型8大原子操作 3. JMM缓存不一致问题 总线加锁 M ...

  8. 全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  9. 全网最硬核 Java 新内存模型解析与实验 - 1. 什么是 Java 内存模型

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

最新文章

  1. JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期
  2. CCNP实验【静态出接口配置】
  3. HTML+CSS+JS实现 ❤️echarts企业地区大数据图表模板❤️
  4. OpenShift 4 - 使用Debezium实现MySQL的CDC变化数据捕获
  5. 第二:Postman做各种类型的http接口测试
  6. timesten mysql_timesten 存储过程
  7. 小米note3如何打开usb调试
  8. 简单易上手的MMD-Ray渲基础教程
  9. 通过cmd查询自己电脑的操作系统是32位还是64位
  10. 顶级数学家玩股票胜过巴菲特 被人建议改行(图)
  11. 订单流失总金额怎么算_微信新规下增长乏力,裂变到底该怎么做?
  12. windows下Graphviz安装及入门教程(附下载链接)
  13. 去除网页腾讯 优酷 爱奇艺右上角logo水印
  14. oracle报错3150,oracle数据恢复
  15. 《沧浪之水》、《因为女人》作者阎真的最新作品《活着之上》的阅后笔记
  16. Win10使用FTP实现手机访问电脑FTP服务
  17. pmsm什么意思_PMSM是什么意思
  18. Python 之 = [:] copy deepcopy
  19. 初始化我的archlinux
  20. php代码应该这样写

热门文章

  1. 文本怎么整体向左缩进_如何设置Word文档的左缩进或者右缩进呢?并在缩进区域输入文字...
  2. 内网通 去广告_新高一攻略|让我们一起跟升学e网通名师看看如何学好高中化学...
  3. nlp 中文停用词数据集
  4. VTK:线性挤压用法实战
  5. VTK:相机模糊CameraBlur用法实战
  6. wxWidgets:常用对话框
  7. boost::thread模块实现生产者消费者的测试程序
  8. boost::sort模块实现使用最坏情况分布进行扩展排序的排序示例
  9. GDCM:gdcm::GroupDict的测试程序
  10. GDCM:检索dicom文件中某个位置存在的Icon测试程序