首页 > 系统相关 >Java 内存模型及若干相关问题

Java 内存模型及若干相关问题

时间:2022-11-15 22:58:21浏览次数:68  
标签:Java 模型 线程 内存 JMM 有序性 CPU

java 的内存模型的理解

java的内存模型是一种抽象,对java 语言在不同硬件平台上运行的差异的一种抽象描述,目的是屏蔽不同硬件平台之间的差异。
JMM定义了线程和主存之间的访问模式: 同一个进程的所有线程共享的变量存于主存中,每个线程有一个该变量的副本。
实际上,在计算机内存架构设计实践中,每个CPU 有自己独享的cache,主流的CPU有3级缓存: L1,L2, L3 cache;其中L1, L2 属于每颗cpu, L3 为多个cpu共享。

参考文献: https://blog.csdn.net/qq_35958391/article/details/124364296

本质上, JMM并不是真实存在的,而是多线程协同工作的一组规范而已!!!需要具体的JVM 实现其语义,这样同一程序在不同平台上的结果才是一致的。
volatile、synchronized、final等,它们的实现原理都涉及 JMM。有了 JMM 的参与,才让各个同步工具和关键字能够发挥作用同步语义才能生效,使得我们开发出并发安全的程序。主要目的就是让 Java 程序员在各种平台下达到一致性访问效果。

重排序、有序性、原子性、可见性概念

参考文献:https://tobebetterjavaer.com/sidebar/sanfene/javathread.html#_19-说说你对原子性、可见性、有序性的理解

  • 重排序:
    为了取得更加高效的运行效率,编译器,JVM,CPU都可能对用户的原始程序在保证结果一致的情况下进行重排序。
    结果是: 实际运行过程中的指令的先后顺序和你程序的先后顺序不一定一致, 但是最终结果无影响。

  • 原子性
    原子性指的是一个操作是不可分割、不可中断的,要么全部执行并且执行的过程不会被任何因素打断,要么就全不执行。

  • 可见性
    可见性指的是一个线程修改了某一个共享变量的值时,其它线程能够立即知道这个修改。
    volatile 和synchronized 能够保证可见性。

  • 有序性
    有序性指的是对于一个线程的执行代码,从前往后依次执行,单线程下可以认为程序是有序的,但是并发时有可能会发生指令重排。(实际上同一个线程的代码也不一定是顺序的,编译器和处理器都可能在as-if-serial的前提下进行指令重排)
    synchronized和volatile都可以保证多线程有序性。

标签:Java,模型,线程,内存,JMM,有序性,CPU
From: https://www.cnblogs.com/happy-to-study/p/16894331.html

相关文章

  • JavaScript基础知识——数据类型
    数据类型在JavaScript中有8中基本数据类型,7种原始类型和1种引用类型。可以将任何类型的值存入变量。例如,一个变量可以在前一刻是个字符串,下一个就存储一个数字。如:letm......
  • Prism通过反射机制自动注册对话视图模型
    摘要说明在使用WPF+Prism开发中,有时会需要使用到一些弹窗服务,而在Prism当中,我们使用Dialog是需要注入到IOC容器当中的,传统的写法如下:而当Dialog过多时或者需要新增一个......
  • 【ES】ES内存占用高,扩内存,重启服务注意事项
    一、参考资料​​Elasticsearch内存占用分析与管理|Tink'sBlog​​​​ElasticsearchJVM堆内存使用率飙升,怎么办?-腾讯云开发者社区-腾讯云​​​​ES集群重启注意事......
  • java——API——匿名对象
                                               12.2.1匿名对象作为方法的......
  • java匿名内部类访问局部变量为啥要用final
    要明白这个问题,首先要知道java参数传递方式只有值传递,即函数调用过程中形参的改变不会影响实参。允许一下代码:1publicclassDemo{23privateUseruser;4......
  • 如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用
    稀疏矩阵的概念一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号及其他的类型的元素。一般来说,在矩阵中,若数值为0的元素数目远远多于非0元......
  • java——API——Scanner类
    Scanner概述一个可以解析基本类型和字符串的简单文本扫描器。Scanner类的功能:可以实现键盘输入数据,到程序当中。属于引用类型引用类型的一般使用步骤1.导包使用import......
  • Java三大版本&JDK、JRE、JVM
    Java三大版本&JDK、JRE、JVMJava三大版本WriteOnce、RunAnywhere(一次编写,随处运行)JavaSE:标准版(桌面程序、控制台开发......),Java的基础与核心,也是JavaEE和JavaME......
  • Java基础语法01
    注释注释不会被执行,属于解释代码的内容单行注释以//开头,只能注释一行文字多行注释以/开头,以/结尾,可以注释多行文字文档注释以/**开头,以*/结尾标识符Ja......
  • 内存分析及数组的3种初始化
    内存分析Java内存分析:数组的3种初始化静态初始化int[]a={1,2,3};Man[]mans={newMan(1,1),newMan(2,2)};动态初始化int[]a=newint[2];a[0]......