JMM作用和原理

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点) 使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追 阅读详情

目录

前言

CPU缓存模型

JMM

1、JMM的作用

2、谈JMM前的说明

3、JMM示意图

JMM有8种原子内存语义操作

1、8种原子内存语义的作用

2、8种原子语义有哪些

3、JMM的8中基本操作必须满足的规则

先行先发原则

1、先行先发原则的作用

2、先行先发原则的规则

3、happen before和JMM的关系

线程的三大特性

原子性

可见性

有序性

Jmm对线程三大特性的保障

volatile介绍

1、volatile内部原理

2、volatile的变量新增的内存语义

3、volatile作用


前言

  1. 多线程内存的划分分为:java线程、工作内存、save和load操作、主内存
  2. 编译器和执行器都会对指令进行重排。处理器通过内存屏障限制指令重排,编译器可以禁止特定类型的编译器进行指令重排。
  3. 指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致

CPU缓存模型

JMM

1、JMM的作用

定义一些规范,处理多线程间数据的通信;解决多线程环境下指令重排序导致的问题。

  • 用于屏蔽不同操作系统间的内存差异,线程和主内存之间的关系。(8种原子性语义操作)
  • 定义Java 源代码到 CPU 可执行指令的这个转化过程要遵守哪些和并发相关的原则和规范。(8种原子性语义操作)
  • 定义了一些并发编程相关的规范来解决一些问题,开发者可以利用这些规范更方便地开发多线程程序。(如:抽象了 happens-before 原则来解决这个指令重排序问题)

2、谈JMM前的说明

  • JMM只是一个抽象内存模型。
  • JMM和物理机内存模型不是一个范畴。
  • JMM和Java运行时数据区没有直接对应关系。

3、JMM示意图

JMM有8种原子内存语义操作

1、8种原子内存语义的作用

用来描述线程本地内存和主动内存的交互协议,java线程之间的通信由JMM控制。

2、8种原子语义有哪些

1、lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。

2、unlock(解锁):作用于主内存的变量,它吧一个处于锁定状态的变量释放出来,释放后的变量才能被其它线程锁定。

3、read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load作用。

4、load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入到工作内存的变量副本中。

5、assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量。

6、store(存储):作用于工作内存的变量,把工作内存的变量传到主内存中,以便随后write操作。

7、write(写入):作用于主内存的变量,把store操作从工作内存中的变量放到主内存中。

3、JMM的8中基本操作必须满足的规则

1、不允许read和load、store和write操作之一单独出现

2、发生过assign操作,必须把变量在工作内存改变后必须同步会主内存(同步的时间点不一定)

3、没有发生过assign操作,不允许把数据从工作内存同步回主内存

4、新变量只能从主内存诞生

5、一个变量同一时刻只允许一个线程对其进行lock操作,但可被同一线程多次lock,lock几次就要unlock几次(synchronized同步代码块原理实现方式)

6、一个变量执行lock操作会清空工作内存中该变量的值

7、变量没有执行lock操作则不能执行unlock操作

8、对变量执行unlock前,必须把此变量同步回主内存(synchronized同步块可见性实现原理)

注意:synchronized对线程原子性、可见行、有序性的保障,其实底层是通过8种基本操作实现的

先行先发原则

1、先行先发原则的作用

  • 为了程序员和编译器、处理器之间的平衡,只要不改变程序的执行结果,编译器和处理器怎么进行重排序优化都行。
  • 会改变程序执行结果的重排序,JMM 要求编译器和处理器必须禁止这种重排序
  • 表达的意义其实并不是一个操作发生在另外一个操作的前面,虽然这从程序员的角度上来说也并无大碍。更准确地来说,它更想表达的意义是前一个操作的结果对于后一个操作是可见的,无论这两个操作是否在同一个线程里。阐述操作之间的内存可见性。

  • 判断数据是否存在竞争,线程是否安全的依据。
  • JMM中的顺序性不能仅仅依靠volatile和synchronized.
  • 先行发生原则和时间的先后顺序没什么关系

2、先行先发原则的规则

A操作先行发生于B操作,那A操作的影响能被B操作观察到。(影响包括内存共享变量值的改变、发送消息、调用方法等)

1、程序次序:一个线程内,按照程序代码的顺序,写在前面的操作先行发生于后面的操作。

2、synchronized相关:unlock先于后面的lock

一个unlock操作先行发生于后面对同一个锁的lock操作。(后面只时间的先后)

3、volatile相关:写先于读

对volatile的写操作先行发生于后面对这个变量的读操作。(后面只时间的先后)

线程相关

4、start():Thread的start()方法先行发生于此线程的每一个动作。(start()先于所有动作)

5、join()或isAlive():线程中的所有操作先行发生于对此线程的终止检验(所有动作先于Thread.join方法结束、Thread.isAlive等)

6、interrupt():线程中断先行发生于对中断检验代码(interrupt()先于Thread.interrupted())

7、finalize():初始化方法的完成先于finalize()的开始

8、传递性:A操作先于B操作,B操作先于C操作,那A操作先于C操作。

3、happen before和JMM的关系

线程的三大特性

原子性

1、基本数据类型的访问读写是具备原子性的

2、lock和unlock操作没有开放个用户直接使用,但是提供了更高级别的字节码指令monitorenter和monitorexit,也就是java中的synchronized快

可见性

一个线程修改了某一个共享变量的值,其他线程是否能够立刻知道这个修改。

1、synchronized和final关键字也具有可见性

2、synchronized可见性是因为,对一个变量执行unlock前,必须先把变量同步回主内存中(执行store和write操作)这条获得的。

3、final可见性,被final修饰的字段在构造器中一旦初始化完成,其它线程就能看见该字段的值。

有序性

由于指令重排序问题,代码的执行顺序未必就是编写代码时候的顺序。

synchronized的有序性是通过 一个变量在同一时刻只允许一个线程对其进行lock操作 获得的。

Jmm对线程三大特性的保障

volatile介绍

1、volatile内部原理

volatile变量赋值后,汇编代码会多一个lock操作,相当于内存屏障,作用是使本CPU的缓存写入内存(相当于store和write操作),该写入动作会使其他cpu的缓存无效,所以valatile变量的修改对其它cpu立即可见。

2、volatile的变量新增的内存语义

1、工作内存中,每次使用使用对象前必须先从主内存刷新最新的值。(其它cpu能看到变量最新的值)

2、工作内存中,每次修改变量后必须立刻同步会主内存中。(其它线程可以看到本线程对变量的修改)

3、volatile修饰的变量不会被指令从排序优化。(a肯定在b之前执行)

volatile boolean a;

int i=3;

int j=5;

volatile boolean b;

3、volatile作用

1、只能保证变量对所有线程的可见性,不能保证原子性和有序性。

2、每次使用前,都要先刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性的问题。

3、使用Volatile变量会禁止指令重排序优化,其实就是内存屏障的作用,(volatile前的代码不会在volatile变量之后执行,volatile变量之后的代码也不会在volatile变量之前执行),保证代码的执行顺序与程序的顺序相同。

4、每次使用变量前必须从主内存刷新最新的值,每次修改变量后必须立刻同步回主内存中。

5、目前商用虚拟机几乎都把64位的数据读写操作作为原子操作来对待。

4、内存屏障

  • 内存屏障(memory barrier)是一个CPU指令。该指令确保一些特定操作执行的顺序,或者影响一些数据的可见性。
  • 编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。
  • volatile通过插入内存屏障(Memory Barrier),在内存屏障前后禁止重排序优化,以此实现有序性。内存屏障有两个作用:一是保证特定操作的执行顺序,二是保证某些变量的内存可见性。

在这里插入图片描述 

 

参考:JMM(Java 内存模型)详解 | JavaGuide(Java面试+学习指南)

我的宠物狗学编程:从零开始的代码之旅 在这个示例中,我们定义了一个名为"interact"的函数,它通过输入函数获取用户的输入,并根据输入执行相应的代码块。在编程中,我们使用条件语句来根据不同的条件执行不同的代码块。对于我的狗狗,我将创建一个名为"feed"的函数来表示它的进食行为,并根据不同的条件输出不同的信息。在这个示例中,我们定义了一个名为"feed"的函数,并使用一个参数"food"来表示食物。对于我的狗狗,我将创建一个名为"dog_name"的变量来存储它的名字。对于我的狗狗,我将创建一个名为"bark"的函数来表示它的叫声。 阅读详情

相关推荐

(P2)PALM软件的基本使用流程

上一篇介绍了PALM在Ubuntu系统上的下载安装及安装后的目录文件结构,这一篇以自带的案例介绍软件的基本操作流程。(请转至example_cbl项目) 输入 声明:官网均有各个变量的说明,以下代码来自软件自带案例 palm的最小输入文件是p3d文件,以下是example_cbl_p3d的详细说明。(文件语言格式Fortran,请自行先学习下语言的基本语法。笔者也是新学者,有非常多的问题,很多参数也不能准确的说出是什么意思,还请不吝赐教,谢谢!!!) !几点说明 !1、该运行文件基本由三大块组成:1)in

ysqzhatian的博客 3259

java 编译运行原理_Java编译和解释执行对比及原理解析

编程语言分为低级语言和高级语言,机器语言、汇编语言是低级语言,C、C++、java、python等是高级语言。机器语言是最底层的语言,能够直接执行。而我们编写的源代码是人类语言, 计算机只能识别某些特定的二进制指令,在程序真正运行之前必须将源代码转换成二进制指令。汇编语言通过汇编器翻译成机器指令后执行,一条汇编指令,对应着一条机器指令。高级语言编程的程序有三种执行方式:1.一种是编译执行,源程序先...

weixin_39712705的博客 980

Win10安装Nek5000

1 安装wsl 2 2 安装Nek5000 3 安装依赖项 4 安装openmpi 5 配置Nek5000 6 编译Nek5000 7 运行Nek5000算例 8 安装paraview并查看结果

weixin_43176703的博客 3451

深入解析JMM原理

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想! 概念 ​ Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Worki

Venus's Blog 4万+

CCS TMSC6748 报错Error connecting to the target: (Error -600 @ 0x0)

CCS TMSC6748 报错Error connecting to the target:(Error -600@ 0x0)

AS_the_deer1717的博客 6636

Sentaurus TCAD学习——Scheme编程语言

sentaurus scheme语言学习记录

摸摸小熊猫的博客 964

深入理解JVM-内存模型(jmm)和GC

1 CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内存模型:什么是java内存模型 在计算机中,cpu和内存的交互最为频繁,相比内存,磁盘读写太慢,内存相当于高速的缓冲区。 但是随着cpu的发展,内存的读写速度也远远赶不上cpu。因此cpu厂商在每颗cpu上加上高速缓存,用于缓解这种情况。现在cpu和内存的交互大致如下。 cpu、缓存、内存 cpu上加入了高速缓存这样做解

zxh2075的专栏 849

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha...

徐子厚的博客 3万+

JMM、Volatile原理、使用、详解看这篇就完事了

JMM(Java内存模型)是规范多线程程序内存访问的抽象概念,定义了线程间共享变量的访问规则。核心包括主内存(共享变量存储)和工作内存(线程私有)。JMM通过原子性、可见性和有序性保证线程安全:原子性确保操作不被中断(synchronized/Lock实现);可见性确保变量修改及时可见(volatile强制刷新主内存);有序性防止指令重排序(volatile/内存屏障)。volatile提供轻量级同步,保证可见性和有序性但不保证原子性,适用于状态标志、单例模式等场景。JMM的happens-before原则

weixin_50835044的博客 1132

环境仿真软件:EcoPath with Ecosim_(4).Ecosim模型动态模拟

Ecosim 是 EcoPath with Ecosim (EwE) 软件中的动态模拟模块,用于模拟生态系统中各个组分的动态变化过程。Ecosim 模型通过时间序列数据和动态参数,可以预测生态系统在不同管理措施下的响应。时间序列数据的输入:用户可以输入历史数据,如捕捞努力、生物量、环境因子等,用于校准模型。动态参数的设置:用户可以设置被捕食率、生长率、捕捞死亡率等动态参数,以反映生态系统的变化。模拟结果的分析。

kkchenjj的博客 893

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

JVM——一文搞懂JMM(Java内存模型)

JVM——一文搞懂JMM(Java虚拟机)

xdx_dili的博客 3199

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令

本文介绍了volatile关键字在Java多线程编程中的作用、内存模型、JMM规范和CPU指令等方面的内容。通过深入剖析其底层实现原理,我们可以更加清晰地了解Java中多线程编程的核心机制,以及如何避免由于多线程环境下数据不一致而导致的错误。

网络技术联盟站 1400

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一起来看看什么是JMM模型

一起来看看什么是JMM模型 JMM(Java Memory Model)是java内存模型,是一种规范、规则,一种抽象的概念。通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。那么JMM规定的访问方式是怎样的,JMM规定,所有的变量必须存储在主内存当中,每个线程访问主内存的变量时,不能直接访问,而是在本线程内开辟一块工作内存,将主内存中的变量复制到工作内存中,线程才可以进行访问。 主内存:存储Java实例对象。 工作内存:存储当前方法的所有本地变量信息(工作内存中

weixin_43489347的博客 1896

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

打工人,从 JMM 透析 volatile 与 synchronized 原理

作者 | 李健青在面试、并发编程、一些开源框架中总是会遇到 volatile 与 synchronized 。synchronized 如何保证并发安全?volatile 语义的内存可见...

HollisChuang's Blog 634

jmm内存模型和原理

jmm内存模型和原理

qq_44417662的博客 189

【编程底层思考】详解Java内存模型(JMM)原理及其作用

JMM是Java并发编程的基石,它定义了多线程程序中共享变量的读写规则,确保了在并发环境下,程序的行为是可预测和一致的。通过理解JMM,开发者可以更好地编写出正确、高效的并发程序。

Dylaniou的博客 729

【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )

volatile一定能保证线程安全吗?禁止指令重排序volatile禁止指令重排序的原理。JMM就是Java内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到...............

陈橘又青的博客 2万+

【转】Java内存模型(JMM)与Volatile关键字底层原理

转自:好文推荐:Java内存模型(JMM)与Volatile关键字底层原理 (baidu.com) 引言 本篇文章结合我个人对Java内存模型的理解以及相关书籍资料为前提全面剖析JMM内存模型,本文的书写思路先阐述JVM内存模型、硬件与OS(操作系统)内存区域架构、Java多线程原理以及Java内存模型JMM之间的串联关系之后再对Java内存模型进行进一步剖析,因为大部分小伙伴在描述Java内存模型JMM时总是和JVM内存模型的概念相互混淆,那么本文的目的就是帮助各位小伙伴彻底理解JMM内存模型

sunshingheavy的专栏 338

Java内存模型(JMM)详解!

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JMM可以理解为是一个规范,一个抽象概念,并不真实存在。

追寻心的步伐 1716

JMM内存模型

概述 JMM,全名为Java Memory Model,即Java内存模型。它是一组规范,需要各个JVM的实现来遵守JMM规范,它屏蔽了各种硬件和操作系统的内存访问差异,以实现Java程序在各个平台下都能达到一致的内存访问效果。不像C/C++那样直接访问物理硬件和操作系统的内存模型,它的主要目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码重排序、处理器会对代码...

sscout的博客 5432

Java内存模型(JMM)及其工作原理,包括栈、堆、方法区等各部分的功能

原子性(Atomicity):原子性表示一个操作是不可分割的,要么全部执行完成,要么都不执行。例如,对一个变量的读写操作是原子性的。可见性(Visibility):可见性表示一个线程对共享变量的修改对其他线程是可见的。JMM通过使用volatile关键字来保证变量的可见性。有序性(Ordering):有序性表示程序在执行过程中指令的执行顺序。JMM允许指令的重排序,但需要保证多线程环境下程序的执行结果与串行执行的结果一致。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 639

第十二章、 Java内存模型JMM——底层原理

1、到底什么叫“底层原理”?本章研究的内容是什么? 1.1 从Java代码到CPU指令 ①最开始,我们编写的Java代码,是*.java文件 ②在编译(javac命令)后,从刚才的*.java文件会变出一个新的Java字节码文件(*.class) ③JVM会执行刚才生成的字节码文件(*.class),并把字节码文件转化为机器指令 ④机器指令可以直接在CPU上运行,也就是最终的程序执行 1.2 JVM实现会带来不同的“翻译”,不同的CPU平台的机器指令又千差万别,无法保证并发安全的效果一致 1.

Coder 617

Java-JMM-内存模型-详解

Java 是最早尝试提供内存模型的编程语言。由于早期内存模型存在一些缺陷(比如非常容易削弱编译器的优化能力),从 Java5 开始,Java 开始使用新的内存模型。一般来说,编程语言也可以直接复用操作系统层面的内存模型。不过,不同的操作系统内存模型不同。如果直接复用操作系统层面的内存模型,就可能会导致同样一套代码换了一个操作系统就无法执行了。Java 语言是跨平台的,它需要自己提供一套内存模型以屏蔽系统差异。这只是 JMM 存在的其中一个原因。

Java程序员的知识博客 1026

Java内存模型JMM

计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。 一般对于的程序的操作就是从数据库查数据到内存然后到CPU进行计算因为有这么多级的缓存(cpu和物理主内存的速度是不一致的) CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题JVM规范中试图定义一种Java内存模型(Java Memory Model,简称 JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM本

Lifelong learning 4032
上一篇: JVM类加载、概念和高级特性
下一篇: 多线程的锁
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值