Java学习历程——浅析Java内存模型(JMM)

我们来看下面的代码,运行程序,我们会发现程序运行后一直没有结束。

package com.java.demo.j,import java.util.concurrent.TimeUnit;
//资源类
public class Test {static class A {int num = 0;}public static void main(String[] args) {A a = new A();//开一个线程操作资源类,使它睡三秒,三秒后修改num的数值并输出。new Thread(()->{try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}a.num = 100;System.out.println(a.num);},"A").start();//num = 0 时while死循环while(a.num == 0) {}}}


运行结果。
如果我们不手动停止这个程序则他永远不会停下来。
按我们一般的思想来说,在线程更改了num的值后while判断num!=0会停止循环并结束程序,但是通过运行程序我们可以看出程序并没有停止。

为什么程序没有停止?

JMM模型

  • 工作内存:

    • 线程对其操作的内存进行复制的一个本地内存副本,不同线程的工作内存不能直接通讯

    • 线程对变量的所有读写操作都要在工作内存中完成。

JMM是java的内存模型,他是Java运行时的一种对于内存的分配机制,这里我们就上面这串代码进行解释。

顺带一提static 修饰的 num也不会使得程序立马结束。

那么我们要怎么做才能使while结束循环,改变这种情况。

————使用volatile关键字修饰num,或者加锁这样就能结束循环
volatile的作用是在主内存中的变量被修改后,通知其他线程变量已经被修改,及时更新工作内存中的数据。

锁:他会清空本地工作内存,从主内存中获取最新值拷贝进工作内存中执行代码,然后操作完毕又把值放回去,释放锁。

据。

锁:他会清空本地工作内存,从主内存中获取最新值拷贝进工作内存中执行代码,然后操作完毕又把值放回去,释放锁。

(待深入了解)

Java学习历程——JVM的JMM模型相关推荐

  1. Java学习历程之----进阶篇(十一)

    千禧难题之二:      霍奇猜想:在非奇异复射影代数簇上, 任一霍奇类是代数闭链类的有理线性组合.它是关于非奇异复代数簇的代数拓扑和它由定义子簇的多项式方程所表述的几何的关联的猜想.由威廉·瓦伦斯· ...

  2. Java学习历程之----提升篇(六)

    科普 知识 前言 前面我们学习了Java语言的三大特性----继承,封装和多态,在前面的Java学习历程之----进阶篇(一)中我们学习到,在面向对象中,类和对象是最基本.最重要的组成单元.所有的对象 ...

  3. Java内存结构(JVM)与内存模型(JMM)

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...

  4. 一个专科生的Java学习历程

    我学的是计算机仿真技术,现在是一名大三学生.从刚刚进入大学的那时候,基本上就下定决心要从事IT行业. 那个时候接触Java真的很痛苦,因为完全没有程序设计的基础,打印出一个九九乘法表都是侥幸,很多同学 ...

  5. JAVA学习之JVM(二)

    双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象.而且加载某个类的 class文件时,Java虚拟机采用 ...

  6. Java学习之JVM探究-2021-08-28~31

    JVM探究 请你谈谈你JVM的理解? java8和之前的变化更新? 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分析 ...

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

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

  8. Java学习日报—JVM垃圾回收全解—2021/11/26

    目录 1.1 确定垃圾对象 1.1.1 引用计数法 1.1.2 可达性分析法 1.2 引用 1.2.1 宣告对象死亡 1.3 方法区回收 1.3.1 回收废弃常量 1.3.2 回收无用的类 1.4 常 ...

  9. java心得!--很好的java学习历程(转自张国宝)

    1.    数组有没有length()这个方法? String有没有length()这个方法? 答:数组没有length()这个方法,有length的属性. String有length()这个方法. ...

最新文章

  1. python小知识_python小知识合集
  2. GPS基站架设完整操作流程
  3. 推断:Facebook的新Java静态分析工具
  4. 运行时异常和检查性异常区别
  5. [前端优化]使用Microsoft Ajax Minifier对资源文件进行压缩优化
  6. LSA类型讲解——LSA-5(第5类LSA——Autonomous System External LSA)、LSA-4(第四类LSA——ASBR Summary LSA)讲解
  7. php分解字符串_php怎么把字符串分解成字符
  8. Oracle 10g新特性——正则表达式(转)
  9. python 二分查找函数_Python基础14_递归函数,二分查找
  10. cad填充密度怎么调整_CAD填充图案时无法正常填充看似封闭的区域怎么解决?
  11. inno setup 卸载注册表_Inno Setup Compiler卸载时删除注册表
  12. 软考笔记0609软件文档三种类别
  13. A Primer on Memory Consistency and Cache Coherence—第五章 Relaxed Memory Model
  14. 毕业论文页码格式制作
  15. GANs(生成对抗网络)浅析
  16. 以下程序从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数。
  17. 事业单位工资计算机公积金计算,求问事业单位住房公积金如何计算
  18. 判断点线位置(结构)
  19. SitePoint Podcast#100:我们的现场周年纪念秀
  20. 记录一次扩ubuntu的文件系统的过程

热门文章

  1. 美学心得(第二百三十七集) 罗国正
  2. 全国各省份名义GDP、实际GDP、GDP平减指数(以2008年为基期,2008-2018年)
  3. 银行卡卡号格式规范 每隔4为一个空格
  4. 计算机英语这门课上后感1000,英语教师听课心得体会作文
  5. JeeCms使用笔记
  6. mysql题目练习的答案
  7. DirectAdmin升级phpMyAdmin版本
  8. 多目标进化算法(MOEAs)概述
  9. Eclipse开发必备干货分享
  10. 《让子弹飞》系列——不输的汤师爷