JUC多并发编程 内存模型

news2024/11/19 9:24:21

计算机硬件存储系统

  • 因为有多级的缓存(CPU 和 物理主内存的速度不一致的), CPU 的运行并不是直接操作内存耳饰先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题
  • JVM 规范中试图定义一种 Java 内存模型(Java Memory Model, 简称 JMM) 来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果

Java 内存模型 JMM

JMM 本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程) 各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变化成对另一个线程可见,关键技术点都是围绕多线程的原子性、可见性和有序性展开的

可见性:

  • 当一个线程修改了某个共享变量的值,其他线程是否能够立即直到该变更,JMM规定了所有的变量都存储在主内存中。
  • 系统主内存共享变量数据修改被写入的时机是不确定的,多线程并发下很可能出现"脏读",所以每个线程都有自己的工作内存,线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等) 都必须在线程自己的工作内存中进行,而不能够直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成、

原子性:

  • 指一个操作是不可打断的,即多线程环境下,操作不能被其他线程干扰

有序性:

  • 对于一个线程的执行代码而言,我们总是习惯性认为代码的执行总是从上到下,有序执行。但为了提升性能,编译器和处理器通常会对指令序列进行重新排列。Java 规范规定 JVM 线程内部维持顺序化语义,即只要程序的最终结果与它顺序化执行的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序
  • JVM 能根据处理器特性( CPU 多级缓存系统、多核处理器等) 适当的对机器指令进行重排序,使机器指令能更符合 CPU 的执行特性,最大限度的发挥极其性能,但是指令重排 可以保证串行语义一致,但没有义务保证多线程间的语义也一致(有可能产生 “脏读”)

  •  单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致
  • 处理器在进行重排序时必须考虑指令之间的数据依赖性
  • 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测

多线程对变量的读写过程:

  • 由于 JVM 运行程序的实体是线程,而每个线程创建 JVM 都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而 Java 内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到线程自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成

JMM 定义了线程和主内存之间的抽象关系:

  1. 线程之间的共享变量存储在主内存中(从硬件角度来说就是内存条)
  2. 每个线程都有一个私有的本地工作内存,本地工作内存中存储了该线程用来 读/写 共享变量的副本(从硬件角度来说就是 CPU 的缓存, 比如寄存器、L1、L2、L3 缓存等)

多线程先行发生原则 happens-before:

  • 它是判断数据是否存在竞争,线程是否安全的非常有用的手段。依赖这个原则,我们可以通过几条简单规则一揽子解决并发环境下两个操作之间是否可能存在冲突的所有问题,而不是陷入 Java 内存模型苦涩难懂的底层编译原理之中。
  • 如果一个操作 happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前
  • 两个操作之间存在 happens-before 关系,并不意味着一定要按照 happens-before 原则指定的顺序来执行。如果重排序之后的执行结果与按照 happens-before 关系来执行的结果一致,那么这种重排序并不非法。

次序原则:

  • 一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作(前一个操作的结果可以被后续的操作获取)

锁定原则:

  • 一个 unLock 操作 先行发生于后面 对同一个锁的 lock 操作

volatile 变量规则:

  • 对于一个 volatile 变量的写操作先行发生于后面对这个变量的读操作,前面的写对后面的读是可见的(后面 同样是指时间上的先后)

传递规则:

  • 如果操作 A 先于发生于操作 B,而操作B 又先行发生于 操作C,则可以得出操作 A 先行发生于 操作C

线程启动规则(Thread Start Rule):

  • Thread 对象的 start() 方法先行发生于此线程的每个动作

线程中断规则(Thread Interruption Rule):

  • 对线程 interrupt() 方法的调用先行发生于被中断线程的检测到中断事件的发生
  • 可以通过 Thread.interrupted() 检测到是否发生中断
  • 也就是说你要先调用 interrupt() 方法设置中断标志位,我才能检测到中断发生

线程终止规则(Thread Termination Rule):

  • 线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过 isAlive() 等手段检测线程是否已经终止执行

对象终结规则(Finalizer Rule):

  • 一个对象的初始化完成(构造函数执行结束) 先行发生于它的 finalize() 方法的开始
  • 对象没有初始化之前,是不能调用 finalized() 方法的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE】倒计时归零时结束游戏

上一篇博客(【UE】一个简易的游戏计时器)完成了游戏时间每秒1的功能,本篇博客在此基础上完成倒计归零时结束游戏的功能 效果 步骤 1. 打开“ThirdPersonGameMode”,将剩余的秒数和分钟数的默认值分别设置为1和59 在事件图表中添…

全球首款车规级彩色激光大灯,这家中国供应商引领下一代显示交互

随着汽车智能化进程进入深水区,基于显示、照明的新技术正在成为新的聚焦点。无论是AR HUD,还是舱内多模态人机交互都在成为新的增量。而汽车独有的智能移动终端以及第三生活空间的未来属性,也在创造新的市场机会。 4月18日,全球领…

法规标准-ISO 16787标准解读

ISO 16787是做什么的? ISO 16787全称为智能运输系统-辅助泊车系统(APS)-性能要求和测试程序,其中主要描述了对APS系统的功能要求及测试规范 APS类型 根据目标停车位类型将APS系统分为两类: 1)APS类型I&a…

北大POJ 1000 ~ 1009

1. AB 🍑 POJ1000 ab 🍔 签到题 import java.io.*; import java.util.*; public class Main {public static void main(String args[]) throws Exception{Scanner cinnew Scanner(System.in);int acin.nextInt(),bcin.nextInt();System.out.println(…

开发常用的 Linux 命令3(文本处理、打包和压缩)

开发常用的 Linux 命令3(文本处理、打包和压缩) 作为开发者,Linux是我们必须掌握的操作系统之一。因此,在编写代码和部署应用程序时,熟练使用Linux命令非常重要。这些常用命令不得不会,掌握这些命令&#…

c提高学习——指针作为函数参数的输入特性

输入特性 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> //在主调函数分配内存 被调函数使用 void func(char *p) {strcpy(p, "hello world"); } void test01() {//在栈上分配内存char buf[1024] …

《使用循环做一些练习》---C语言

目录 前言&#xff1a; 1.练习专题 1.1打印1-100之间的奇数 1.2计算n的阶乘 1.3计算到达n阶乘的前m个阶乘相加 1.4演示字符串动态变化的效果 2.goto语句 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础…

扬声器,打印机2键触摸VK3602K SOP8 2键2通道触摸检测芯片技术资料直接输出自动校准功能

型号&#xff1a;VK3602K 封装形式&#xff1a;SOP8 KPP2620 VK3602K具有2个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度&#xff0c;仅需极少的外部组件便可实现触摸按键的检测。 提供了2路直接输出功能,可通过IO脚选择输出电平。…

基于单片机的家庭防盗报警系统的设计与实现_kaic

基于单片机的家庭防盗报警系统 专业&#xff1a;物联网工程 摘要&#xff1a;本论文研究的是将AT89C52单片机芯片作为核心元器件的防盗报警系统,该系统除了具有直接报警的功能外,还额外增加了布防和红外感应的功能。和市场上的其他各类防盗报警器相比,该设计的不同之处在于它所…

KubeSphere 助力提升研发效能的应用实践分享

作者&#xff1a;卢运强&#xff0c;主要从事 Java、Python 和 Golang 相关的开发工作。热爱学习和使用新技术&#xff1b;有着十分强烈的代码洁癖&#xff1b;喜欢重构代码&#xff0c;善于分析和解决问题。原文链接。 我司从 2022 年 6 月开始使用 KubeSphere&#xff0c;到目…

开放原子训练营(第一季)铜锁探密:基于铜锁构建在线在线加密工具箱

基于铜锁构建Web在线加密工具库 搭建运行环境 实验⼿册中的实验都是以 docker 和 docker-compose 环境为主&#xff0c;基于 Ubuntu 20.04 容器镜像。 初始化项目 首先利用 IDE 创建一个 tongsuo_web 的空项目&#xff0c;接下来我们所有的文件都会创建在该项目中&#xff0…

AI如何帮助人类进而验证直觉的可靠性?

AI可以通过以下方式帮助人类寻找反例进行否定或寻找特别的架构&#xff1a; 1. 利用机器学习算法进行反例搜索。AI可以训练一个分类器&#xff0c;用于判断某个假设是否成立。通过反复训练和测试&#xff0c;AI可以识别出一些不合理的假设&#xff0c;并帮助人类进行进一步的验…

docker安装-顺利的安装docker--再也不烦心啦

centos7安装Docker全过程记录&#xff08;无坑版教程&#xff09; 一、安装前必读 在安装 Docker 之前&#xff0c;先说一下配置&#xff0c;我这里是Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8以上貌似也可。 注意&#xff1a;本文的命令使用的是 r…

004 鸿蒙应用开发-通知栏

目录 一.通知概述 通知简介 通知业务流程 广播的类型 接口说明 开发前期准备 二.发送普通文本类型通知 1.先初始化广播的请求request 2.然后发送广播 3.显示效果如下 三.发送长文本类型广播 1.构建发送广播的参数request 2.然后发送广播 3.显示效果如下 注意事项…

利用ArcGIS软件赋予tif影像空间参考坐标系

问题&#xff1a; 在处理数据时有一幅没有任何空间参考坐标信息的tif影像&#xff0c;实质上为一个照片。现在需要将其与一个有空间地理参考坐标信息的shp文件叠加在一起。如何解决这个问题呢&#xff1f; 已知信息&#xff1a; shp文件的空间地理参考 shp文件的边界与tif影像的…

CV中的注意力机制

注意力机制 计算机视觉中的注意力机制的基本思想 就是想让系统学会注意力 &#xff0c;能够忽略无关信息&#xff0c;关注重点信息。 1. 硬注意力机制&#xff08;Hard/Local Attention&#xff09; 对每个输入项分配的权重非0即1&#xff0c;和软注意不同&#xff0c;硬注…

Sentence Bert 阅读笔记

Sentence Bert 阅读笔记 论文 https://arxiv.org/abs/1908.10084 Supervised / Unsupervised / Semi-supervised 从训练上看&#xff0c;是 Supervised / Unsupervised 两种结合 Model Structure 本文提出了两个architecture&#xff0c;一个用于文本的分类&#xff0c;一…

【Python基础绘图】自定义函数,一键标注相关性热力图的显著性

相关性热力图标自动注显著性 01 引言 很早之前其实就写过一篇博客【python相关性热力图自动标记显著性】介绍如何在相关性热力图上自动标注显著性&#xff0c;不过收到好多同学私信问我数据源是啥样的&#xff0c;怎么计算的啊等等问题。所以今天打算重新写篇&#xff0c;并附…

【github开源】Linux iptables 界面化 分布式 管理平台 go vue,底座firewalld

快速部署&#xff1a;Uranus 目前最优的firewalld前端 如果你觉得项目符合你的使用场景, 劳烦大佬点个 &#x1f31f;&#x1f31f;&#x1f31f; 吧!!! 好人一生平安!!! Uranus Gateway Uranus使命是将iptables转化为类安全组功能的一个工具 Uranus Gateway 是一个分布式管…

Android Studio添加EasyPemissions

问题描述 按照EasyPermissions主页描述的那样添加完依赖后&#xff0c; 在程序中使用还是报错&#xff1a; Failed to resolve: pub.devrel:easypermissions:0.3.0 解决方法 首先&#xff0c;EasyPemissions属于别人的开源库&#xff0c;我们想使用的话&#xff0c;必须让…