关于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

目录
相关文章
|
1月前
|
存储 缓存 资源调度
|
18天前
|
存储 缓存 Java
深入理解JMM
深入理解JMM
|
缓存 Java 编译器
05.深入理解JMM和Happens-Before
大家好,我是王有志。今天我们一起来学习Java并发编程中最重要的两个理论知识JMM和Happens-Before原则。
77 1
05.深入理解JMM和Happens-Before
|
11月前
|
存储 Java 调度
你了解的JMM内存模型是它吗?
JMM(java memory model)java内存模型,它并没有实际的体现,它是一个规则,都知道ava是跨平台语言,在个操作系统中内存都有一定的差异性,每个系统的并发不一致,JMM的作用就是用来屏蔽掉不同操作系统中的内存差异性来保持并发的一致性。同时JMM也规范了JVM如何与计算机内存进行交互。JMM就是Java自己的一套协议来屏蔽掉各种硬件和操作系统的内存访问差异,实现平台一致性达到最终的"一次编写,到处运行"
|
11月前
|
存储 缓存 安全
Java内存模型JMM
计算机存储结构,从本地磁盘到主内存到CPU缓存,也就是从硬盘到内存,到CPU,一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算 因为有这么多级的缓存(CPU和物理主内存的速度是不一样的) CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题 JVM规范中试图定义一种java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异 以实现让java程序在各种平台下都能达到一致的内存访问效果
55 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)。
96 0
|
缓存 自然语言处理 安全
java内存模型总结
在说java内存模型之前,先澄清下JVM内存结构与Java内存模型 JVM内存结构和Java虚拟机的运行时区域有关 Java内存模型和Java的并发编程有关 JVM内存结构,我们都知道java是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途。在《Java虚拟机规范jdk8》中说了JVM运行是内存区域结构可以分为6个区。 堆区 虚拟机栈 方法区 本地方法栈 程序计数器 运行时常量池 以上是java虚拟机规范,不同的虚拟机实现会各有不同,一般会准守规范 这里总结下,JVM内存结构由java虚拟机规范定义的
73 0
|
存储 缓存 安全
JAVA内存模型(JMM)详解
JAVA内存模型(JMM)详解
214 0
JAVA内存模型(JMM)详解
|
缓存 Java 编译器
java内存模型
java内存模型
112 0
java内存模型
|
存储 缓存 Java
Java内存模型(JMM)详解(2)
Java内存模型(JMM)详解
152 0
Java内存模型(JMM)详解(2)