深入理解java内存模型(jmm)(代码片段)

单片机菜鸟哥 单片机菜鸟哥     2022-12-18     733

关键词:

纯属学习B站教学视频笔记,方便查阅

1、多核并发缓存架构

CPU高速(对应电脑上)缓存:现代CPU性能强运算速度快,而RAM速度并没有随之增长,所以如果CPU直接和RAM通信会直接拉低了CPU性能。运行程序时,把主内存RAM数据读取到CPU高速缓存,通过高速缓存和CPU进行数据交互。不过高速缓存就稍微有点贵。

2、Java内存模型(JMM,Java Memory Model)

Java线程内存模型和Cpu缓存模型类型,是基于Cpu缓存模型来建立的,Java线程内存模型是标准化的,屏蔽掉了底层不同计算机的区别。主要注意每个线程自己独立拥有的工作内存以及共享变量副本

举个错误例子:

public class VolatileVisibilityTest 
    
  // private static volatile boolean initFlag = false; // 注意volatile可见性

  private static boolean initFlag = false;
  
  public static void main(String[] args) throws InterruptedException
     
	 new Thread(()->
	    System.out.println("waiting data...");
		while(!initFlag) 
		   
		
		System.out.println("============ success");
	 ).start();
  
     Thread.sleep(2000);
	 
	 new Thread(()->prepareData()).start();
  
  

  public static void prepareData() 
      System.out.println("prepareData data...");
	  initFlag = true;
	  System.out.println("prepareData data end...");
  

3、JMM数据原子操作(干货)

通过JMM原子操作理解Java内存模型。

3.1 read —— 读取

  • 从主内存读取数据

3.2 load —— 载入

  • 将主内存读取到的数据写入到工作内存

3.3 use —— 使用

  • 从工作内存读取数据来计算

3.4 assign —— 赋值

  • 将计算好的值重新赋值到工作内存中

3.5 store —— 存储

  • 将工作内存数据写入主内存

3.6 write —— 写入

  • 将store过去的变量值赋值给主内存中的变量

3.7 lock —— 锁定

  • 将主内存变量加锁,标识为线程独占状态

3.8 unlock —— 解锁

  • 将主内存变量解锁,解锁后其他线程可以锁定该变量

4、不加volatile下的原子过程分析

以原子操作解读上面的代码。先解读没有加Volatile的代码









到这一步其实就可以看到,数据不一致(数据修改可见性)。

5、MESI缓存一致性协议

多个cpu从主内存读取同一个数据到各自的高速缓存,当其中某个cpu修改了缓存里的数据,该数据会马上同步回主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效

6、加volatile下的原子过程分析

在上面的基础上,

重新read store之后会得到新的值。

7、volatile缓存可见性实现原理(lock、unlock原子操作)

底层实现主要是通过汇编lock前缀指令,它会锁住这块内存区域的缓存(缓存行锁定)并回写到主内存。

  • 会将当前处理器缓存行的数据立即写回到系统内存
  • 这个写回内存的操作会引起在其他cpu缓存了该内存地址的数据无效(MESI协议)


注意一下加锁位置(加锁颗粒度考虑问题):

8、volatile不保证原子性

private static volatile int num = 0;

多线程执行一个 num++

多个线程同一时刻做num++


要解决这个原子性问题,最终还是得在线程进行操作数据的时候做一些加锁限制。(也就是对方法加锁)

  1. synchronized关键字
  2. Java.util.concurrent包中的lock接口和ReentrantLock实现类

深入理解jvm虚拟机读书笔记——内存模型与线程(代码片段)

注:本文参考自周志明老师的著作《深入理解Java虚拟机(第3版)》,相关电子书可以关注WX公众号,回复001获取。1.Java内存模型JMM概述:Java内存模型指的是JMM,而不是运行时数据区哦~Java语言为了保证... 查看详情

全面理解java内存模型(代码片段)

...算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Jav 查看详情

重新认识java内存模型(jmm)(代码片段)

通过学习《深入理解Java虚拟机》有关Java内存模型的介绍,整理的学习笔记,供你参考。文章目录Java内存模型定义主内存和工作内存CPU普及内存间交互操作对于volatile型变量的特殊规则原子性、可见性与有序性先行发生&#x... 查看详情

全面理解java内存模型(jmm)及volatile关键字(代码片段)

本篇主要结合博主个人对Java内存模型的理解以及相关书籍内容的分析作为前提,对JMM进行较为全面的分析,本篇的写作思路是先阐明Java内存区域划分、硬件内存架构、Java多线程的实现原理与Java内存模型的具体关系,... 查看详情

基于jvm原理jmm模型和cpu缓存模型深入理解java并发编程

...的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存、CPU、缓存等予以说明。实际上,在实际的Java开发工作中,仅仅了解并发编程的创建、启动、管理和通信等基本知识还是不够的。一方面,如果要... 查看详情

jmm(java内存模型)详解(代码片段)

...则是什么?happens-before常见规则有哪些?谈谈你的理解?happens-b 查看详情

全面理解java内存模型

...个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率... 查看详情

全面理解java内存模型(代码片段)

...算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效... 查看详情

java内存模型-jmm

...计算机的虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率... 查看详情

玩命死磕java内存模型(jmm)与volatile关键字底层原理(代码片段)

...多数据库知识引言本篇文章结合我个人对Java内存模型的理解以及相关书籍资料为前提全面剖析JMM内存模型,本文的书写思路先阐述JVM内存模型、硬件与OS(操作系统)内存区域架构、Java多线程原理以及Java内存模型JMM... 查看详情

玩命死磕java内存模型(jmm)与volatile关键字底层原理(代码片段)

...多数据库知识引言本篇文章结合我个人对Java内存模型的理解以及相关书籍资料为前提全面剖析JMM内存模型,本文的书写思路先阐述JVM内存模型、硬件与OS(操作系统)内存区域架构、Java多线程原理以及Java内存模型JMM... 查看详情

深入了解java内存模型——jmm

这篇文章可能有点长,但是他想的非常详细从多核CPU+多线程引发的缓存一致性问题等来引出JMM的必要性,个人认为是一篇高质量的博客终于有人把Java内存模型(JMM)说清楚了https://www.jianshu.com/p/8420ade6ff76 查看详情

深入了解java内存模型——jmm

这篇文章可能有点长,但是他想的非常详细从多核CPU+多线程引发的缓存一致性问题等来引出JMM的必要性,个人认为是一篇高质量的博客终于有人把Java内存模型(JMM)说清楚了https://www.jianshu.com/p/8420ade6ff76 查看详情

从cpu说起,深入理解java内存模型!(代码片段)

Java内存模型,许多人会错误地理解成JVM的内存模型。但实际上,这两者是完全不同的东西。Java内存模型定义了Java语言如何与内存进行交互,具体地说是Java语言运行时的变量,如何与我们的硬件内存进行交互的。... 查看详情

来,了解一下java内存模型(jmm)

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文,就来整体的介绍一下Java内... 查看详情

深入理解java内存模型——顺序一致性

数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争... 查看详情

多线程&高并发深入浅出jmm-java线程内存模型(代码片段)

实际上JMM是虚拟机根据计算机内存模型模拟而来的,所以说理解计算机内存模型也是很重要的。为什么Java要引入JMM这个概念?由于Java是一门跨平台的语言,所以要屏蔽系统间的差异性;不同系统之间CPU和主存之... 查看详情

java内存模型jmm详解!(代码片段)

...一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存区域)。并发编程有多种... 查看详情