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

一、什么是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
    • 对一个变量加锁之前,必须把工作内存中的变量值同步回主内存

image

存在问题:

假设现在有一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防腐投加器需要加盐吗_果干、果脯、蜜钱、水果脆片,哪个有营养?你吃对了吗?...

时下,追求健美瘦身的年轻人,常把水果千作为零食、加餐的选择之一。大家认为水果干不仅味道好,富含营养素,而且热量低。还有一些人会把果脯、蜜钱、水果脆片等当作新鲜水果的替代品,用以补充营养一认为果 脯、蜜钱的原料…

.NET6正式版将近,70%开发者或面临技术断层!

过往一周,VS2019 发布了最新V16.11,正式支持热重载;.NET6发布了最后一个预览版Preview7,各大新功能宣告完成;随之C#10的新特性也基本成型,好东西很多!各种密集的版本更新,佐证了行业…

一只蝙蝠的自述在朋友圈火了:千万不要再吃野味了!

全世界只有3.14 % 的人关注了青少年数学之旅来源:少女兔(ID:iiilass)、人民日报(ID:rmrbwx)从营养价值上来看野生动物和家养动物的差别微乎其微既不能延年益寿,也不能青春永驻它们不…

掌握JVM 运行时数据区,其实不是很难,加薪也是要技巧可言的!!!

一、概念 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 J…

不要被约束的意思_俗话说:“娶妻不娶颧骨高,嫁汉不嫁连眉梢”,到底什么意思?...

“世有伯乐,然后有千里马。千里马常有,而伯乐不常有。”——《杂说》 唐韩愈传说春秋时期,有个叫伯乐的人很会选马,他选马的时候,并不需要骑着马真刀真枪地跑几圈,只是看看马的骨相、听听马的嘶鸣就能判断出…

终于来了!微软正式推出 VS Code 测试 API

随着 Visual Studio Code 1.59.0 正式版本的发布,全新的插件测试 API 也从试验版本进入了正式版本。自 2020 年 9 月起至今,经过了将近一年及数次版本迭代的打磨,不管是 API 的功能性还是易用性,与首个预览版本相比都获得了极大的…

MariaDB 10的复制 集群 高可用搭建 大表拆分【持续更新中】

视频地址 http://edu.51cto.com/course/course_id-1691.htmlMariaDB 10培训课程第一部分 复制1.基于GTID方式复制配置及注意事项2.基于表的并行复制3.多源复制(MariaDB 10支持多主一从)4.从库延迟如何找到那条执行慢的SQL5.复制异常处理1062,1032错误处理…

c++歌手大赛系统_计人即讯|第十届程序设计大赛

“第十届程序设计大赛”为激发学生学习计算机语言和科学使用计算机的热情,培养独立思考、勇于创新的探索精神和敢闯会创的意志品格,我院于12月5日13时30分在中主阶教201室成功举办了“第十届程序设计大赛”。本次大赛主要考察选手们应用计算机解决生活中…

限时9.9元 | 快速领取数学建模竞赛备战必备技巧与论文详解!

全世界只有3.14 % 的人关注了青少年数学之旅大家晚上好,随着美赛时间的公布以及大大小小的数学建模竞赛的进行,小天经常可以收到来自很多小伙伴们提出的问题,“竞赛中如何去考虑选题?”、“如何进行思路分析?”、“参考…

项目经理问我Java内存区域模型!急急急

也就这么点吧 Java内存区域主要分为:堆,栈,方法区三大部分 1、堆:是内存区域中最大的部分,所有线程共享,其中存放创建的对象和数组。由于堆是垃圾收集器管理的主要区域,因此也叫GC堆。 2、栈…

设计模式之中介者

中介者模式介绍中介者模式中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。中介者模式顾名思义,可以用我们平时生活中的房产中介去理解…

你的网页加载太慢了怎么办?

客户反映,“网页速度太慢了!!”,怎么办? 这个问题似乎有些难以解决,慢了就是慢了,也许用户使用就是一个56K猫,也许服务器只有256K的带宽,也许是网页设计有问题&#xff…

看了这个逻辑关系图,才更清晰为何不让你随便外出了

全世界只有3.14 % 的人关注了青少年数学之旅看了这个逻辑关系图,才更清晰为何不让你随便外出了。非常时期,爱国、爱家、爱自己,请近期减少不必要的外出,直到官方宣布疫情解除!转载来源:刘小兔爱画画部分素材…

ef 关联依赖属性_基础巩固之:xmlns属性梳理

转载自&#xff1a;https://www.cnblogs.com/osttwz/p/6892999.html<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…

高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水

文章开篇问一个问题吧&#xff0c;一个java程序&#xff0c;如果其中一个线程发生了OOM&#xff0c;那进程中的其他线程还能运行吗&#xff1f; 接下来做实验&#xff0c;看看JVM的六种OOM之后程序还能不能访问。 在这里我用的是一个springboot程序。 /*** author &#xff…

架构 | 聊聊我心中的架构设计观

【架构设计】| 总结/Edison Zhou在各种面试场合&#xff0c;可能都会被问到“你对架构设计的理解”&#xff0c;我也在最近的转正答辩中被技术委员会负责人问到&#xff0c;这里我重新整理一下思绪&#xff0c;聊聊我心中的的架构设计观。1系统的本质是什么&#xff1f;作为一个…

GeneralUpdate 2021.08.14更新公告

GeneralUpdate是基于.net standard2.0开发的一款&#xff08;c/s应用&#xff09;自动升级程序。该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf&#xff0c;控制台应用&#xff0c;winfrom。1.Notice预计会使用Blazor开发GeneralUpdate官网&#xff0c;介…

这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了

全世界只有3.14 % 的人关注了青少年数学之旅最近在广州地铁&#xff0c;有人戴了这种自制的硬核“面罩”&#xff01;广州地铁后来回应说&#xff0c;这些人其实也戴了口罩&#xff0c;否则光戴着桶还是不可以进地铁的目测这种“全方位防护”效果应该不错网友爆料说&#xff0c…

面试问外观模式???这不就是设计模式里面的吗?我给你上一课吧,面试官

面试问外观模式&#xff1f;&#xff1f;&#xff1f;这不就是设计模式里面的吗&#xff1f;我给你上一课吧&#xff0c;面试官外观模式介绍实现步骤 1Shape.java步骤 2Rectangle.javaSquare.javaCircle.java步骤 3ShapeMaker.java步骤 4FacadePatternDemo.java步骤 5外观模式 …

ab st语言编程手册_西门子PLC编程SCL和LAD谁才是王者?一起讨论一下

现在很多大品牌的中高级 PLC 都支持国际电工委员会 IEC61131 标准中规范的五种编程语言的混合编程&#xff0c;即梯形图&#xff08;LD&#xff09;、结构化文本(ST)、流程图&#xff08;SFC&#xff09;、指令表&#xff08;IL&#xff09;和功能块(FB)。在这五种编程语言中&a…