首页 > 系统相关 >Java内存模型

Java内存模型

时间:2023-09-25 15:34:12浏览次数:35  
标签:Java 变量 模型 访问 线程 内存 JMM

Java Memory Model,JMM是一种规范,定义了程序中各个变量的访问规则,以及在某个线程中对这些变量进行访问时需要遵守的同步策略,所以其目的是解决多线程正确执行的问题。

Java内存模型确保了多线程程序的可见性、有序性和原子性;主要内容包括:

  1. 主内存(Main Memory):所有变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问。
  2. 工作内存(Working Memory):每个线程都拥有自己的工作内存,保存了该线程使用到的变量的副本拷贝,线程只能读写自己的工作内存中的变量,不能直接访问主内存中的变量。
  3. 线程内表(Thread-Local Storage):每个线程都有一个私有的本地内存,称为线程内表,用于存储线程执行过程中的临时数据。
  4. 内存间交互操作:线程通过读取和写入操作与主内存进行交互。读操作将数据从主内存复制到工作内存,写操作将修改后的数据刷新到主内存中。
  5. volatile关键字:被volatile修饰的变量的值会在每次被线程访问时从主内存刷新,即直接从主内存中读取变量的值。
  6. 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中的一系列指令,要么全部执行成功,要么全部执行失败。JMM保证基本数据类型的读写操作不会被其他线程干扰,保证数据的完整性。
  7. 可见性(Visibility):JMM确保一个线程对共享变量的修改对其他线程可见。当一个线程修改了一个共享变量的值,其他线程能立即知道这个修改。即一个线程在工作内存中修改了数据后,必须将最新的数据刷新到主内存,以便其他线程可以读取到更新后的数据。
  8. 有序性(Ordering):JMM保证程序的执行顺序按照一定的规则进行,不会出现随机的重排序现象。

标签:Java,变量,模型,访问,线程,内存,JMM
From: https://www.cnblogs.com/liu-im/p/17728034.html

相关文章

  • #define 定义的明示变量就是在预处理阶段用标识符后面的值替换标识符,因此不会占据内存
    1.常考:预处理阶段只进行文本替换,不进行运算对于最后一条,预处理指令定义的标识符都不会占据内存。预处理指令也称预编译指令,即在编译之前进行一些处理,而预处理做的其实就是文本替换,这个过程也叫做宏展开,即用宏定义后面的替换体将程序中出现宏的地方替换掉。例如,#define定义的明示......
  • Java中的线程池的线程数量如何确定?
    可能很多人都看到过一个线程数设置的理论:CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2不会吧,不会吧,真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单......
  • Java基础
    equals()方法equals()方法的作用是比较两个字符串是否相等。为避免空指针异常finall关键字final关键字:可以修饰,变量,方法,类。final修饰的类无法被继承。final修饰的方法无法被覆盖,无法被重写。当final修饰的变量没有赋值时,允许第一次赋值,第二次报错。final......
  • Java数组
    Arrayjava语言中数组是一种引用数据类型。不属于基本数据类型。数组的父类是object。数组是一个容器,数组是一个数据的集合。数组中可以储存基本数据类型的数据,也可以储存引用数据类型的数据。数组是引用类型,所以数组对象储存在堆内存当中的。数组当中储存的是Java对象的话,实......
  • Java SE 21 新增特性
    JavaSE21新增特性作者:Grey原文地址:博客园:JavaSE21新增特性CSDN:JavaSE21新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresRecordPatterns该功能首次在JavaSE19中预览,在JavaSE20中发布第二次预览版,在此版本中成为永久性功......
  • 使用Intellij Idea打包java为可执行jar包
    自己在实际工作中的需要,使用Idea打包项目为可执行的jar包,网上找了好多文章但总是不成功,多次尝试后终于跑通,所以记录下来,希望可以帮助各位步骤:1.选中Java项目工程名称,在菜单中选择 File->projectstructure... (快捷键Ctrl+Alt+Shift+S)。2.在弹出的窗口中左侧选中"Artifact......
  • java读取resouces目录下文件
    resources中存放一些个资源文件,比如properties文件等,编译好会自动将这里边的文件复制到target/classes里去。获取资源文件的方法说明:XXX.class.getResourceAsStream()返回的是inputstreamXXX.class.getResource("/")返回URL,是classpath的位置XXX.class.getClassLoader().getRes......
  • java中mysql索引过多导致查询的时间不稳定
    在Java中,MySQL索引过多可能导致查询时间不稳定的情况确实存在。尽管索引可以加速查询,但是索引也会带来额外的维护成本和存储开销。当数据库表中存在过多的索引时,可能会导致以下几个问题:查询优化器选择困难:当有多个索引可供选择时,查询优化器需要评估每个索引的成本和选择最佳的索引......
  • Java内存模型——基础
    JMM因何产生由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲——将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回......
  • 运行时数据区——Java堆
    Java程序在运行时创建的所有类实例或数组都放在同一个堆中。一个Java虚拟机实例中只存在一个堆空间,因此所有线程都将共享这个堆,它在虚拟机启动时创建。又由于一个Java程序独占一个Java虚拟机实例,因而每个Java程序都有它自己的堆空间——它们不会彼此干预。但是同一个Java程序......