关于JMM的理解

简介: JMM是java内存模型,它描述的是和多线程相关的一组规范。通过这组规范定义了程序中对各个变量的访问方式。保证了不同jvm运行并发程序的结果的一致性和可靠性。

JMM是java内存模型,它描述的是和多线程相关的一组规范。通过这组规范定义了程序中对各个变量的访问方式。保证了不同jvm运行并发程序的结果的一致性和可靠性。

在JMM中有主存储器和工作存储器两种概念(主存工作内存)。JMM规定所有变量都存储在主存中,并且每个线程都有自己的工作内存。线程的工作内存中保存主存中某些数据的拷贝,并且线程对变量的所有操作都必须在工作内存中进行,不能直接读写主存。不同线程也不能访问其他线程的工作内存,线程间通信必须通过主存完成。

JMM有三大特性:

原子性:一个或多个操作,要么全部执行,要么全部不执行。

可见性:只要有一个线程对共享变量(valoatile修饰才会成为共享变量)的值做了修改,其他线程都能马上收到通知,立刻获得最新值。

有序性:在线程内观察,操作都是有序的,而在线程内观察另一个线程,操作都是无序的(因为指令重排序和工作内存和主存的同步延迟)。


java提供了两个关键字volatile和synchronized来保证多线程间操作的有序性

synchronized通过加锁防止多个线程同时执行一段代码,线程执行互斥代码的过程如下:

  1. 获得同步锁;
  2. 清空工作内存;
  3. 从主内存拷贝对象副本到工作内存;
  4. 执行代码;
  5. 刷新主内存数据;
  6. 释放同步锁。

因此synchronized既保证了多线程的并发有序性,又保证了多线程的内存可见性。

volatile有两个作用:禁止指令重排序,保证内存可见性。它是依靠内存屏障(内存栅栏)实现的,内存屏障提供三个功能:1、确保内存屏障前后的指令不会发生跨屏障的重排。2、对volatile修饰变量的修改会立刻刷入主存。3、对volatile变量的写操作会使其他CPU中的缓存失效,因此必须重新从主存读取。

但是volatile不能保证操作的原子性,因此不能保证多线程的并发有序。

参考:

https://blog.csdn.net/LYQ20010417/article/details/124138635

https://blog.csdn.net/zjcjava/article/details/78406330

目录
相关文章
|
5月前
|
存储 缓存 资源调度
|
2月前
|
存储 缓存 Java
Java内存模型(JMM)
Java内存模型(JMM)是一个抽象概念,用于规范程序中各种变量(实例字段、静态字段及数组元素)的访问方式,确保不同Java虚拟机(JVM)上的并发程序结果一致可靠。JMM定义了主存储器(所有线程共享)与工作存储器(线程私有)的概念,线程间通过主存储器进行通信。JMM具备三大特性:原子性(确保基本读写操作的不可分割)、可见性(确保一个线程对共享变量的修改对其他线程可见)、有序性(防止指令被处理器或编译器重排序影响程序逻辑)。通过这些特性,JMM解决了多线程环境下的数据一致性问题。
|
2月前
|
缓存 安全 Java
简单了解下JMM解决什么问题
Java内存模型(JMM)是Java语言规范的一部分。JMM通过“happens-before”规则和内存屏障等机制,确保在多线程程序中,各线程对共享变量的操作行为符合预期。
39 3
|
4月前
|
存储 缓存 Java
深入理解JMM
深入理解JMM
|
缓存 Java 编译器
05.深入理解JMM和Happens-Before
大家好,我是王有志。今天我们一起来学习Java并发编程中最重要的两个理论知识JMM和Happens-Before原则。
114 1
05.深入理解JMM和Happens-Before
你了解的JMM内存模型是它吗?
JMM(java memory model)java内存模型,它并没有实际的体现,它是一个规则,都知道ava是跨平台语言,在个操作系统中内存都有一定的差异性,每个系统的并发不一致,JMM的作用就是用来屏蔽掉不同操作系统中的内存差异性来保持并发的一致性。同时JMM也规范了JVM如何与计算机内存进行交互。JMM就是Java自己的一套协议来屏蔽掉各种硬件和操作系统的内存访问差异,实现平台一致性达到最终的"一次编写,到处运行"
|
存储 缓存 安全
Java内存模型JMM
计算机存储结构,从本地磁盘到主内存到CPU缓存,也就是从硬盘到内存,到CPU,一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算 因为有这么多级的缓存(CPU和物理主内存的速度是不一样的) CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题 JVM规范中试图定义一种java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异 以实现让java程序在各种平台下都能达到一致的内存访问效果
79 0
|
存储 缓存 Java
java内存模型JMM
Java内存模型(Java Memory Model,简称JMM),即Java虚拟机定义的一种用来屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能够达到一致的内存访问效果的内存模型。本篇文章大致涉及到五个要点:1、Java内存模型的基础,主要介绍JMM抽象结构;2、Java内存模型中内存屏障;3、Java内存模型中的重排序;4、happens-before原则;JMM相关的三个同步原语(synchronized,volatile,final)。
122 0
|
存储 缓存 安全
JAVA内存模型(JMM)详解
JAVA内存模型(JMM)详解
274 0
JAVA内存模型(JMM)详解
|
存储 缓存 Java
Java内存模型(JMM)详解(2)
Java内存模型(JMM)详解
171 0
Java内存模型(JMM)详解(2)