12 原子性|可见性|有序性|JMM内存模型
1 并发三大特性
1.1 原子性
一个或多个操作,要么全部执行,要么全部不执行。Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,但不采取任何原子性保障措施的自增操作不是原子性的,如:i++
public class AtomicTest {static int count = 0;public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10; i++) {new Thread(()->{for (int j = 0; j < 1000; j++) {count++;}}).start();}Thread.sleep(2000);System.out.println(count);}
}
上述结果每次执行都不一致,说明发生了线程安全问题
如何保证原子性?
sychronized、lock锁、CAS(AtomicInteger)
1.2 可见性
多个线程访问同一变量,一个线程对其进行修改,其它线程能及时感知
如何保证可见性?
volatile、内存屏障、sychronized、lock锁
1.3 有序性
程序执行的顺序按代码先后顺序执行(为了提升性能,编译器和处理器常常会对指令做重排序,这就可能引发有序性问题)
Java有序性依赖内存屏障
如何保证有序性?
volatile、内存屏障、sychronized、lock锁
2 Java内存模型JMM
并发编程需解决的问题:
1 多线程间如何通信(线程间以何种机制交换数据)
2 多线程间如何同步(不同线程间操作发生的相对顺序)
2.1 JMM的抽象结构
JMM决定一个线程对共享变量的写入何时对另一个线程可见
JMM定义了线程和主存之间的抽象关系
1 共享变量存在主存
2 每个线程又有自己私有的本地内存
3 本地内存存共享变量的副本
4 线程对共享变量的所有操作都必须在本地内存中进行,不能直接读取主存

线程A和线程B要通信的话,必须经历以下两个步骤:
线程A把本地内存A更新过的共享变量更新到主内存
线程B到主内存读取线程A更新过的共享变量
注:线程A无法直接访问线程B的工作内存,线程间通信必须经过主存
2.2 主内存与工作内存交互协议
八大原子操作:
lock:作用于主内存,把一个变量标识为线程独占状态(主内存)
unlock:释放主内存独占状态的变量(主内存)
read:主内存变量传输到工作线程中(主内存)
load:将read操作得到的变量放入工作内存的变量副本中(工作内存)
use:工作内存中的变量传递给执行引擎(工作内存)
assgin:从存储引擎得到的值,赋值给工作内存的变量(工作内存)
store:工作内存的一个变量值传到主内存(工作内存)
write:将store操作从工作内存的变量值放到主内存变量(主内存)
八大原子操作必须满足的规则:
1 把一个变量从主存复制到工作内存,必须顺序地按照read和load操作;把变量从工作内存同步回主存中,必须顺序地按store和write操作
2 不允许 read load store write操作单独出现
3 不允许一个线程丢弃assgin,变量在内存中改变之后必须同步到主存
4 不允许一个线程未发生assgin就从工作内存同步到主存
5 一个新的变量只能在主存中诞生,不允许在工作内存中使用一个未被初始化的变量
6 一个变量同一时刻只允许一个线程进行lock,但可以被同一线程重复执行多次,但也需执行相同次数的unlock操作
7 若对一个变量执行lock操作,会清空工作内存中此变量的值(执行引擎使用这个变量必须重新load或assign)
8 不允许unlock一个未被lock的变量
9 对一个变量执行unlock之前,必须先把该变量同步到主内存中(执行store和write)
可见性问题的产生:
线程B对变量flag的修改,并不会让线程A感知,只有当线程B对主存共享变量flag进行lock时,线程A才会重新去主存中获取
Java中可见性底层的两种实现方式:
1 内存屏障(sychronized、Thread.sleep(10)、volatile)
2 CPU上下文切换(Thread.yield()、Thread.sleep())
2.3 锁的内存语义
锁释放和释放锁的内存语义:
线程获取锁时:JMM把该线程对应的本地内存置为无效
线程获取锁时:JMM把该线程对应的本地内存中变量刷新到主存中
sychronized关键字的作用是确保多个线程访问共享资源时的互斥性和可见性;在获取锁之前,线程会将共享变量的最新值从主存 -> 工作内存,释放锁后会将修改的值刷到主存中,保证可见性
2.4 volatile内存语义
2.4.1 volatile写的语义
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主存中
public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 10; i++) {new Thread(() -> {for (int j = 0; j < 10000; j++) {count++; //static volatile int count = 0;}}).start();}Thread.sleep(10000);System.out.println(count);
}
上述结果会有所不同,原因:当变量被use到执行引擎中时,volatile并不能改变执行引擎中的值,当变量在执行引擎assign回工作内存中时,会发生覆盖
2.4.2 volatile读的语义
当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,需要从主存中读取共享变量(volatile读能保证每次读都是最新的数据)
2.4.3 volatile内存语义实现原理
相关文章:
12 原子性|可见性|有序性|JMM内存模型
1 并发三大特性 1.1 原子性 一个或多个操作,要么全部执行,要么全部不执行。Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,但不采取任何原子性保障措施的自增操作不是原子性的,如:i public c…...
pytorch代码复现1(基础知识)
创建矩阵 全零矩阵 In [4]: import torch torch.__version__ xtorch.empty(5,3) xOut[4]: tensor([[0.0000e00, 0.0000e00, 4.6430e-23],[1.4013e-45, 1.2612e-44, 0.0000e00],[3.5733e-43, 0.0000e00, 0.0000e00],[0.0000e00, 0.0000e00, 0.0000e00],[0.0000e00, 0.0000e00, 0…...
PostGreSQL模式schema
问题引入 之前在做数据库设计时,经常会忽略schema模式,直接在数据库下的public模式下建立各类数据表。如果数据表命名不够规范,后期寻找某张表时就会比较麻烦。通过 所幸,PostgreSQL 的模式schema管理,可以对这个问题…...
大厂面试题-什么是JVM
JVM全称是Java虚拟机,在聊什么是JVM之前,我们不妨看⼀下这张图。 从这张图中可以看出JVM所处的位置,同时也能看出它两个作用: 1、运⾏并管理Java源码⽂件所⽣成的Class⽂件, 2、在不同的操作系统上安装不同的JVM&#…...
rest参数
Rest参数是ES6中新增的一个语法特性,也称为剩余参数。其语法形式为三个点(...)加上一个名称,用于表示函数的参数个数不确定,可以将多余的参数收集到一个数组中。Rest参数只能作为最后一个参数出现,且一个函…...
Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)
MapReduce原理分析 什么是MapReduce 前言:如果想知道一堆牌中有多少张红桃,直接的方式是一张张的检查,并数出有多少张红桃。 而MapReduce的方法是,给所有的节点分配这堆牌,让每个节点计算自己手中有几张是红桃&#…...
JS DataTable中导出PDF中文乱码
JS DataTable中导出PDF中文乱码 文章目录 JS DataTable中导出PDF中文乱码一. 问题二. 原因三. vfs_fonts.js四. pdfmake.js五. 解决六.参考资料 一. 问题 二. 原因 DataTable使用pdfmake,pdfmake默认字体为Roboto,不支持中文字体。添加自己的字体&#…...
代码签名证书续费
代码签名证书的有效周期是1-3年,这种情况下证书到期了就要重新申请办理,最开始同样的申请验证步骤还要再走一遍,尤其是Ukey还是要CA机构重新颁发,还是要等待快递配送。OV代码签名证书、EV代码签名证书目前行业内统一采取Ukey存储&…...
机器学习之ROC与AUC
文章目录 定义ROC曲线:AUC(Area Under the ROC Curve): 定义 ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the ROC Curve)是用于评估二分类模型性能的重要工具。 …...
实用篇-Eureka注册中心
一、提供者与消费者 服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务) 服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口) 例如前面的案例中,order-service微服务是服…...
基于springboot实现篮球竞赛预约平台管理系统项目【项目源码+论文说明】
基于springboot实现篮球竞赛预约平台管理系统演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,篮球竞赛预约平台也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大&…...
OpenHarmony docker环境搭建所见的问题和解决
【摘要】OpenHarmony docker环境搭建需要一台安装Ubuntu的虚拟机,并且虚拟机中需要有VScode。 整个搭建流程请参考这篇博客:OpenHarmony docker环境搭建-云社区-华为云 (huaweicloud.com) 上篇博主是用Ubuntu的服务器进行环境搭建的,在使用VS…...
1817_ChibiOS的RT线程
全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于线程,有几个概念需要弄清楚:声明、生命循环、延迟、线程引用、线程队列、线程时间、优先级管理、调度。 2. 两个声明…...
牛客网刷题-(7)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
多模态领域的先进模型
多模态学习领域涌现了许多先进的模型,这些模型能够处理来自不同感官模态的信息并实现多模态任务。以下是一些先进的多模态学习模型: CLIP (Contrastive Language-Image Pretraining):由OpenAI开发的CLIP是一种多模态预训练模型,能…...
列表自动向上滚动
列表自动向上滚动 鼠标放上去 自动停止滚动 <div id"list-detail-main"><div class"my_table_thead_tr"><div v-for"(item, index) in header" :key"index" class"my_table_thead_th">{{ item }}</div…...
嘴笨的技术人员怎么发言
对于嘴笨的人来说,即兴发言简直就是灾难,想想自己窘迫的模样,自己都受不了,但职场又避免不了这种场合,所以,就要靠一些技巧让我们顺利打开思路了。 那么,今天就分享几个解救过我的不同场景即兴发…...
vue源码分析(三)——new Vue 的过程(详解data定义值后如何获取的过程)
文章目录 零、准备工作1.创建vue2项目2.修改main.js 一、import Vue from vue引入的vue是哪里来的(看导入node_modules包)1: 通过node_modules包的package.json文件2: 通过配置中的main入口文件进入开发环境的源码(1&a…...
软考系统架构师知识点集锦四:信息安全技术基础知识
一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高,但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…...
Vscode中不显示.ipynb文件单元格行号
找到设置,搜索line number: 看到下面那个Notebook: Line Numbers 控制单元格编辑器中行号的显示。,选择on即可;...
如何在5分钟内完成Blender 3MF插件的终极安装与配置
如何在5分钟内完成Blender 3MF插件的终极安装与配置 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender 3MF插件是一款革命性的开源工具,专为3D打印工作流…...
PDF补丁丁深度解析:高效PDF文档处理与批量优化完整指南
PDF补丁丁深度解析:高效PDF文档处理与批量优化完整指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https://g…...
6、深入解析transforms.RandomAffine():参数详解与实战应用
1. 什么是RandomAffine变换? RandomAffine是PyTorch中torchvision.transforms模块提供的一个非常实用的图像增强方法。简单来说,它能够对图像进行一系列随机的仿射变换操作。你可能要问:什么是仿射变换?其实它就是我们日常生活中常…...
从‘套娃’结构到SOTA效果:我是如何用U2-Net搞定商品抠图与海报生成的
从‘套娃’结构到SOTA效果:我是如何用U2-Net搞定商品抠图与海报生成的 去年双十一大促前,我们电商团队遇到了一个棘手问题:每天新增的上万张商品图需要快速去除背景,用于生成营销海报。传统Photoshop手动处理每张图需要5-10分钟&a…...
安装paperclip
介绍: # aperclip - 一人工公司的开源编排工具 ## 项目概述 Paperclip 是一个基于 Node.js 的服务器和 React UI,用于编排 AI 代理团队来运营业务。它允许用户导入自定义代理、分配目标,并通过一个仪表板跟踪代理的工作和成本。 核心价值主…...
数字记忆守护者:WeChatMsg让微信聊天记录成为永恒的时光胶囊
数字记忆守护者:WeChatMsg让微信聊天记录成为永恒的时光胶囊 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
大模型学习笔记------SAM模型架构拆解与实战指引
1. SAM模型架构全景拆解 第一次看到SAM模型时,就像拿到了一台精密的瑞士手表——外表简洁但内部构造复杂。这个由Meta提出的"分割一切"模型,确实改变了计算机视觉领域的游戏规则。想象一下,你只需要在图片上随便点几个点࿰…...
玩转哔哩哔哩视频下载:3分钟掌握DownKyi的高效秘籍
玩转哔哩哔哩视频下载:3分钟掌握DownKyi的高效秘籍 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等ÿ…...
创作灵感枯竭?试试Asian Beauty Z-Image Turbo:一键生成多种东方人物设定
创作灵感枯竭?试试Asian Beauty Z-Image Turbo:一键生成多种东方人物设定 1. 为什么你需要这个东方美学生成工具 作为一名内容创作者,你是否经常遇到这样的困境:脑海中构思了完美的东方人物形象,却苦于找不到合适的视…...
面向 LLM 的程序设计 4:API 版本化与演进——在「模型会记忆旧文档」前提下的兼容策略
用三句话先说明白 人会照旧说明书办事,模型也一样。 它见过的文档、缓存里的接口描述、网页上没刷新的说明、向量库里还没更新的片段,都可能比真实系统更旧。于是系统已经升级了,它还在用老地址、老字段名、老例子去调用。 给人改流程&#…...
