什么是JMM以及volatile的特性(对于volatile的理解)

如何解决ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. 解决ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE 阅读详情

JMM是java内存模型

在这里插入图片描述
JMM有三大特性:可见性,原子性,有序性
volatile 三大特性:它是java虚拟机提供的轻量级的同步机制,有三个特点:1 保证可见性 2:不保证原子性 3:禁止指令重排
在这里插入图片描述

在这里插入图片描述
t1在自己的工作内存中改了age的数值后又传回给主物理内存,但是其他两个线程并不知情
在这里插入图片描述
此时涉及到JMM中的一个特性,可见性,就是一个线程修改主物理内存后其他线程得到通知,重新更新那个变量
代码证明:
在这里插入图片描述
在这里插入图片描述
程序没有停,因为main线程没有收到number修改的信息

修改后,加入了volatile关键字以后,一个线程修改了变量,其他线程也会收到信息
在这里插入图片描述

volatile不保证 原子性

运行结果不是20000
在这里插入图片描述
在这里插入图片描述

如何解决原子性

在这里插入图片描述
在这里插入图片描述
可以看到下边这条正常执行了
在这里插入图片描述

volatile禁止指定重排

指令重排
在这里插入图片描述
在这里插入图片描述
如图,语句4因为存在数据的依赖性,因为他不确定到底是用11还是16所以这里不会指令重排。
在这里插入图片描述
再看另一个指令重排的案例:
在这里插入图片描述
单线程环境下按顺序执行不需要考虑,多线程环境下就有可能发生指令重排,例如:flag=true抢在了a=1的前边,此时另一个线程抢到了时间片执行if方法,那么a的值就为5.
volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象。

为什么volatile能实现禁止指令重排优化呢

内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令它的作用有两个: 一是保证特定操作的执行顺序,二是保证某些变量的内存可见性(奎勇该特性实现volatile内存可见性)
由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序,也就是说通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化。内存屏障另外一个作用是强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版本。
在这里插入图片描述
在这里插入图片描述

在哪些地方用过volatile

单例模式 :
如果只被new了一次的话,那么这句话就会被打印一次。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上边这个实例是正常情况下单线程执行的情况
在多线程环境下单例模式很显然出问题了
在这里插入图片描述
加了关键字synchronized关键字以后这个控制住了
在这里插入图片描述
用DCL解决
在这里插入图片描述
这里只是用了一个同步代码块,并没有把整个方法锁起来,相比前一种方法更好一点。
即使是这个方法也有一个潜在的隐患,因为多线程环境下系统会进行指令重排,所以有可能会出现错误,因此加入volatile可以禁止指令重排
在这里插入图片描述
但是指令重排只会保证串行语义的执行的一致性(单线程),但并不会关心多线程间的语义一致性,所以当一条线程访问instance不为null时,由于instance实例未必已初始化完成,也就造成了线程安全问题。
下图代码
在这里插入图片描述
地址空间分配出去了,但是在初始化的过程中可能有其他线程读到这里,发现对象为空,所以为了解决这种线程不安全的问题需要加入volatile关键字禁止指令重排
在这里插入图片描述

Hyper-V显卡直通实战:手把手解决Windows 11虚拟机错误码43(附完整参数配置) 本文详细解析了在Windows 11 Hyper-V虚拟机中配置显卡直通时遭遇错误码43的根源,并提供了从环境检查、核心PowerShell命令(如Set-VMGpuPartitionAdapter)配置到虚拟机内驱动替换的完整实战解决方案,帮助用户彻底解决显卡驱动无法加载的问题。 阅读详情

相关推荐

计组实验5:cache大小测量与 cache line 大小测量

前言 今天做了实验5,通过 c 语言测 cache 参数。其实按理来说挺简单的,只是我们班没给代码,纯靠自己。听说别的班有给代码 emm 因为《深入理解计算机系统》这本书上面给的代码是 Linux 平台下的,而且需要一个 fcyc2 头文件,可以在 https://github.com/fabiensanglard/CpuCacheMountainViewer 这里找到。 ⚠ 我没有在 Linux 下试过课本上面的代码。。。 我是在 win10 下测试的。。。 所以 。。。 我并不确定我的代码是否正确。

AKGWSB 's blog 1万+

一、JMM模型与volatile详解

一、JMM模型 JMM是java内存模型的简称,是一个抽象的概念,它是围绕原子性、有序性、可见性展开的。 (1)主内存是共享内存区域,所有变量都存在主内存中,所有线程都可以访问; (2)各个线程的工作线程相互独立和隔离; (3)线程操作变量必须先从主内存中读取变量信息,然后在工作内存中进行修改,最后再写会主内存中,修改才会生效。 二、JMM与硬件内存架构的关系 从硬件层面描述一下多线程执行过程: cpu中一个核执行线程A,发现需要用到数据a,就会首先在寄存器中查找,发现没有,就会接着去L1中寻找,接着找

lovesman的博客 1204

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

【Java】volatile的线程安全与不安全

一、前言 我们知道在多线程的场景下,线程安全是必须要着重考虑的。Java语言包含两种内在的同步机制:同步块(synchronize关键字)和 volatile 变量。但是其中 Volatile 变量虽然使用简单,有时候开销也比较低,但是同时它的同步性较差,而且其使用也更容易出错。下面我们先...

chuangjin1715的博客 1708

Spring AI 实战:5 分钟搭建你的第一个 AI 应用(含完整代码)

能力关键 API适用场景基础对话简单问答、文本生成流式输出实时打字机效果@Bean模型需要调用外部工具结构化输出需要返回 Java 对象多轮对话聊天机器人场景Spring AI 让 Java 开发者可以用最熟悉的方式(Spring Boot + Maven)进入 AI 应用开发领域,不用学新语言,不用换框架,这是它最大的优势。但目前为止,我们的 AI 应用只能回答"它脑子里已有的知识"。如果让它读懂你自己的技术文档、公司内部知识库呢?这就是下一篇文章的主题——RAG(检索增强生成)实战。

qq_17204557的博客 642

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1772

Volatile能不能保证线程安全?

对于volatile关键字,大家都很熟悉,字面意思也比较简单,线程共享,每个线程都能读取到主内存的最新数据,但真的用好就不是那么简单的事,为什么需要volatile来线程共享?又为什么线程读取的不是最新的数据而需要volaile来实现呢?volatile能不能保证线程安全呢? 首先要理解线程安全是什么,当不同的线程在并发运行的时候,修改的数据在不同的线程显示不同的数据,发生脏读,比如a线程修改了张三的金额从100-10=90,而b线程获取的张三金额还是100,这时候就出现了脏读,多线程个线程导致了线程

ke1ying的博客 7887

【ESP 保姆级教程】第三方库篇 ——TimeLib库,一个非常Nice的时间库,结合第三方进行校正时间

Time,这是一个为Arduino提供时间支持的库。 这个库的例子中会教会我们多种方式去获取时间: - 一个`RTC`时钟 - 网络`NTP`时间 - `GPS`时间

单片机菜鸟哥的博客 3674

JMM——volatile的内存语义

volatile 理解volatile特性的一个好方法: 把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步   锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性, 这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值 锁的语义决定了临界区代码的执行具有原子性 如果是多个vo

此岸花开 2061

Open3D 进阶(32)渐进三角网(PTD)地面滤波

渐进三角网地面滤波算法(Progressive TIN Densification, PTD)是一种广泛应用于机载LiDAR点云数据处理的滤波方法,旨在从复杂场景中精确分离地面点,以生成数字高程模型(DEM)。

点云侠的博客 1533

人工智能训练师三级·模型生命周期真题40题|训练→评估→调优全链路通关

本文为人工智能训练师三级考试真题解析系列第2篇,聚焦模型生命周期全链路(训练→评估→调优)。内容包含40道精选真题,覆盖数据划分、模型训练、评估指标、超参数调优4个核心阶段。重点考察:1)数据集的合理划分方法(留出法、交叉验证);2)模型训练的基本原理;3)关键评估指标(准确率、召回率、F1等)的应用场景;4)超参数调优技术(网格搜索、随机搜索等)。通过真题解析帮助考生系统掌握模型生命周期的闭环迭代方法论,提升从数据准备到模型优化的全流程实践能力。适合备考人工智能训练师三级认证的考生学习参考。

白话机器学习 89

java中voliate

csdn博客:https://blog.youkuaiyun.com/yinbucheng/article/details/71305951voliate只保证元素的一致性,只保证每个线程读的结果是一样的,但是多个线程同时执行++的操作的时候,可能会丢失++,最终结果小于那个结果...

shiyanshi805的博客 1206

电化学-NanoStat-开源系统的使用说明

本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。

分享技术笔记,希望对大家能够有一定的帮助,同时也通过归纳总结提升自己的个人能力。 2000

JMM三大特性理解以及volatile简单使用

JMM概念 JMM的三大特性 Volatile的使用

m0_52889702的博客 730

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jmm的理解和Volatile的使用和特性

JMM java内存模板(概念):就是用来对java线程中内存变量读取改变的一些规范 JMM的一些约定 线程解锁前,必须吧共享变量刷回主存 线程加锁前,必须读取主存中的最新值到工作内存中 加锁和解锁是同一吧锁 不允许操作单独使用 JMM的执行流程 主存初始值变量 线程read(读取)变量到工作内存,load(加载)到线程工作内存 执行引擎将工作内存中的变量user(使用),使用完然后assign(赋值)给工作内存 工作内存将变量store(储存)主存中,然后write(写入)到主存中 volatil

醉死梦红尘的博客 250

谈谈对volatile的理解(三大特性)?了解JMM(java内存模型)?

首先JUC是java .util.concurrent的简称,cuncurrent是并发。 一:并发和并行的区别: 二:谈谈你对volatile的理解: volatile是java虚拟机提供的轻量级的同步机制。包含三大特性:A:保证可见性 B:不保证原子性 C:禁止指令重排。 1:保证可见性(比如B线程马上能够看到A线程更改的数据): 首先先看一段代码: public class MyThread extends Thread{ public static int a=0; ..

weixin_43156133的博客 264

(一)玩命死磕Java内存模型(JMM)与Volatile关键字底层原理

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

weixin_45101064的博客 843

详解什么是JMM!

1.JAVA内存模型——JMM 1.1 现代计算机的内存模型   早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。需要注意的是,加入了高速缓存的机制,并不

GD_YuZhe的博客 1万+

JMM内存模型

JMM内存模型JMM内存模型图解JMM数据原子操作流程Volatile可见性底层实现原理并发编程三大特征volatile和synchronized的区别 JMM内存模型图解 Java线程内存模型与cpu缓存模型类似,是基于cpu缓存模型建立的。Java线程内存模型标准化,屏蔽了底层不同计算机的区别。图解: 当多个线程运行起来时,会将主内存中的共享变量拷贝一份到自己的工作内存当中,如果没有进行设置...

weixin_43833048的博客 239

java从内存角度理解类变量_深入理解volatile类型——从Java虚拟机内存模型角度...

一、前言在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度。所谓知己知彼、百战不殆。本文从JVM内存模型角度,探讨volatile的实现原理。在明白了volatile的实现原理后,再回过头来使用它,会有一种一览众山小的感觉吧,使用起来会更加得心应手。二、Java内存模型(JMM)1、并发编程关键问题...

weixin_31992501的博客 116

深入理解Java内存模型JMM

目录 一:JMM基础与happens-before 并发编程模型的分类重排序处理器重排序与内存屏障指令happens-before 二:重排序与JMM的as-if-serial 数据依赖性as-if-serial语义程序顺序规则重排序对多线程的影响 三:顺序一致性内存模型与JMM 数据竞争与顺序一致性保证顺序一致性内存模型同步程序的顺序一致性效果未同步程序的执行特性 该系列博文会告诉你如何全面深入地学习Java并发技术,从Java多线程基础,再到并发编程的基础知识,从Java并发包的入门和实战,再

通往IT大道的专栏 144

Java并发---volatile和Synchronized

volatile变量自身具有下列特性。·可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。·原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。 当读一个volatile变量时,JMM会把该线程...

坚持住啊 216

Java并发指南6:Java内存模型JMM总结

简介   首先介绍两个名词:1)可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。2)共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量     Java线程之间的通信对程序员完全透明,在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步。   通信:通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态来进

wr_java的博客 294

jmm与并发

JMM 主内存和工作内存 主内存 包括:实例字段、静态字段、和构成数组对象的元素;但不包括局部变量和方法参数,因为他们是线程私有的 所有变量都存储在主内存 工作内存是线程使用到的变量的主内存的副本,线程对变量的操作必须在工作内存中进行 内存交互操作 lock unlock read load use assign store write 操作规则: volatile ——jv...

Duncan_dsf的博客 377

Java内存模型JMM

Java内存模型 != JVM内存模型!!!!!! 文章目录一、引入二、Java内存模型(JMM)是什么2.1 主内存和工作内存2.2 内存间交互操作(八大指令)2.3 指令规则2.4 long和double型变量的特殊规则三、JMM存在的必要性四、Java内存模型的三大特征(原子性、可见性、有序性)4.1 原子性(synchronized具有原子性)4.2 可见性(volatile、sync...

和尚 813

深入理解Java虚拟机JVM高级特性与最佳实践阅读总结—— 第十二章 Java内存模型与线程

Java内存模型JMM,主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存读取变量的底层细节,这里的变量不包括线程私有的变量,如局部参数;内存模型规定所有变量存储在主内存;每个线程都有自己的工作内存,其中保存了该线程用到的变量的主内存的副本;注意,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存的变量; 内存间的交互动作,即工作内存与主内存之间的拷

WYCPhoenix的博客 1164

java内存模型JMM

文章目录面试谈谈JMMJMM与Java内存区域划分的区别与联系为什么在 32 位的机器上对 long 型变量进行加减操作存在并发隐患谈谈volatilevolatile和synchronized的区别谈谈happens-beforeas-if-serial和happens-before对比并发编程模型JMM三大特性原子性可见性有序性volatile内存屏障(写前读后)保证可见性禁止重排序指令重排序现象(以后再看)禁止指令重排原理不保证原子性happens-before7大happens-before关系(以

kk阿彬 238

并发编程 — 内存模型 JMM

Java 内存模型之JMM

搬运Gong 488
上一篇: java路线------集合
下一篇: 详谈CAS---以及ABA问题
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值