一、什么是JMM?

JMM指的是Java内存模型,即 Java Memory Model

  • Java内存模型并不是一种实际存在的东西,而是一种人为形成的约定,是一种概念。

    关于JMM,我们需要了解一些相关的同步约定 :
  1. 线程在解锁前,必须将线程中的工作内存中存储的值即时刷新到主内存中的共享变量!
  2. 线程在加锁前,必须读取主存中的最新值到工作内存中!
  3. 加锁和解锁是同一把锁!

线程中操作的数据要从主内存中读取,并备份到线程自己的工作内存中,作为副本,主存并不会主动向线程更新数据。

线程的八种内存交互操作:

  • lock(锁定):作用于主内存的变量,把一个变量标识为线程独占状态
  • unlock(解锁) :作用于主内存的变量,把一个处于锁定状态的共享变量释放
  • read(读取):作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中
  • load(加载):作用于工作内存的变量,把通过read操作获取的变量值放入工作内存中
  • use(使用):作用于工作内存的变量,把工作内存中的变量传输给执行引擎,每当虚拟机遇到需要使用到变量的值,就会使用到这个指令
  • assign(赋值):作用于工作内存的变量,把执行引擎传输过来的值放入工作内存
  • store(存储):作用于主内存的变量,把一个从线程中的工作内存的变量值传送到主内存中,以便后续的write操作
  • write(写入):作用于主内存的变量,将store操作从工作内存获取的变量值放入主内存中

JMM对以上八种内存操作指令做出了如下约束:

  • readloaduserassignstorewritelockunlock必须成对出现,不允许单独操作其中一条指令
  • 不允许线程丢弃离它最近的assign操作,即工作内存中的变量值改变之后,必须告知主内存
  • 不允许一个线程将没有assign过的数据从工作内存同步会主内存
  • 一个新的变量必须在主内存中产生,不允许工作内存私自初始化一个变量来作为共享变量,即实施usestore操作之前 , 必须经过 load 和assign操作
  • 同一变量同一时间只允许一个线程对其进行lock操作;多次lock之后,必须执行相同次数的unlock对其解锁
  • 如果对一个变量进行lock操作,会清空所有工作内存中此变量的值, 即每次获得锁的线程,加锁前必须要重新读取主内存中的变量值,才能提交给执行引擎进行use操作
  • 如果一个变量没有被lock,就不能对其进行unlock操作,也不能对一个被其他线程锁住的变量进行unlock
  • 对一个变量加锁之前,必须把工作内存中的变量值同步回主内存

存在问题:

假设现在有一个main线程和一个普通线程,普通线程执行的操作是:当num为 0 时 ,一直循环下去;此时main线程给num赋值为 1 ,普通线程并不知道num已经被修改,程序就会一直执行,不会停止!

public class VolatileDemo {private static int num = 0;public static void main(String[] args) {new Thread(()->{ // 线程1while (num == 0) {}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}num = 1;System.out.println(num);}
}

解决方法 : volatile 关键字

什么是volatile ?

  • volatile 是一种轻量级的同步机制,相对于synchronized来说

  • 保证可见性 => JMM 主内存中的共享变量修改之后,会通知所有线程备份到各自的工作内存中

  • 不保证原子性

  • 禁止指令重排

最后,祝大家早日学有所成,拿到满意offer

因为我把JMM原理讲解了一遍,这给足了我涨薪的底气!相关推荐

  1. 全网最全原理讲解!2021年抓住金三银四涨薪好时机,跳槽薪资翻倍

    开头 25岁那年,我从京东离职,入职百度. 在百度认识了当时的架构师久哥(T9级别),因为他的一番话,彻底改变了我的职业生涯,短短三年的时间,我从一枚普通程序员成长为别人眼中的技术大咖. 当时因为业务 ...

  2. 震碎认知!将原理融会贯通到顶点的SpringBoot实战项目,面试涨薪的神器

    Spring Boot是什么? 我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准, ...

  3. php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解

    PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...

  4. nginx反向代理原理讲解

    一 .概述                  反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...

  5. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  6. 解密汽车全景行车安全系统的前世和今生——第二讲:原理讲解

    解密汽车全景行车安全系统的前世和今生--第二讲:原理讲解 来源:深圳市汽车电子行业协会 作者:姜卫忠 发布时间:2013-3-7  浏览(4648)次 解密汽车全景行车安全系统的前世和今生 第二讲:全 ...

  7. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  8. IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解

    IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...

  9. 艺点动画-跟随原理讲解

    艺点动画-跟随原理讲解 如果要想顺便解决就业问题的话,可以去试试看成都艺点动画,这家教学质量, 蛮高的毕业后是可以直接在公司里面上班的 方法/步骤 1.什么是动画里的跟随? 动画的跟随指的是:物体在运 ...

最新文章

  1. split join append
  2. java输出image_java如何生成imagecode
  3. 帝国cms怎么增加php,帝国CMS增加系统配置字段
  4. C#中理解接口以及接口的作用
  5. python学习记录2
  6. 装饰模式在Intermec CK1应用程序中通讯模块的应用
  7. Shell-find+exec
  8. Markup.h 和 Markup.cpp 文件(下一篇)内容,直接复制创建就行了
  9. 算法设计之数字三角形问题
  10. 80后小学计算机课上的游戏,80后最值得回味的15个经典课间游戏(组图)
  11. 用Python实现一个商场管理系统(附源码)
  12. leetCode 3,js解法
  13. Java 练习题 Fibonacci数列
  14. 手机模型真机图片的制作——UI出图
  15. Logisim中六进制计数器的设计
  16. 一颗韭菜的自我修养:用Python分析下股市,练练手
  17. ScrumMaster的教练职责
  18. 各分辨率图片生成神器
  19. 考研后居然能让自己改变那么多?!
  20. 在万家灯火阑珊处,重新认识平板电脑

热门文章

  1. .NET Core 迁移躺坑记续集--Win下莫名其妙的超时
  2. 领域驱动设计,让程序员心中有码(三)
  3. 2018 .NET开发者调查报告: .NET Core 是怎么样的状态
  4. .NET Exceptionless 日志收集框架本地环境搭建
  5. .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线
  6. 在传统.NET Framework 上运行ASP.NET Core项目
  7. .NET CoreCLR开发人员指南(上)
  8. C# 读取文件内容/输出txt log
  9. java打包维护_java打包详解
  10. C++之‘malloc’ was not declared in this scope和invalid conversion from ‘void*’ to ‘char*’