Java并发编程 之 volatile

Java并发编程——volatile关键字 Java并发编程——volatile关键字概述一、内存模型二、并发编程的三个概念三、Java内存模型四、剖析volatile关键字4.1 volatile关键字的两层含义4.2 volatile能否保证原子性五、使用volatile关键字场景六、总结常见问题 概述 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性、可见性和有序性。只要有一条原则没有被保证,就... 阅读详情

国庆已经结束了,本该在国庆前就应该做好这篇笔记的,怎奈自己太懒,就在今天把前几天的知识梳理一下。在前几篇的博客介绍了一点并发编程的相关知识,今天我对volatile的原理简单的阐述一下。

要想理解volatile的原理,需要对JMM(Java内存模式)有些了解。

在实际的程序运行中,由于cpu执行速度很快,而从内存读取数据和向内存写入数据的过程跟cpu执行指令的速度比起来要慢的多,于是在cpu就引入了缓存。

也就是说在运行的时候主存中的数据会在缓存有一份拷贝,cpu的操作是针对这个拷贝去进行的,最后在把结果写会到主存中。


这里写图片描述

可是这样在多线程运行就有可能出现问题。比如:i=i+1;(i的初始值为1)

假设有两个A、B线程运行这个程序,一开始两个线程都分别有i这个值的拷贝存在缓存中。A先对缓存进行i+1的操作,缓存中i这时候已经是2了,然后写会到主存中,主存也是2。

但是B线程在运行在主存被刷新之前,就已经有了i的拷贝,也就是说线程B的缓存i的值还是1,而不是A线程运行完毕的2,那么这就出现了错误。

但是这里就算是用volatile来修饰这个i,程序的结果还是有可能会报错。要想用对volatile就要保证数据操作的原子性。

用volatile修饰一个变量的时候,当对该变量有写的操作,会强制将修改的值立即写入主存,它可以保证其他线程每次的读取,都是一个最新的值。

这就是volatile的可见性,可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。如i=i+1,它包括读取变量的原始值、进行加1操作、写入工作内存。就算你用volatile来修饰i也还是有可能会出错。情况和上面是一样的。

虽然A线程是把主存刷新了,发出信号,让其他拥有该变量的线程中的数据变成无效状态,当处理器对这个数据进行修改操作的时候,就会从内存中重新读取。但是B线程是在主存被刷新之前就读取了,并且已经完成了对i+1的操作,后面的操作只是对i的写回内存操作,并没有涉及到修改操作,所以这样还是保证不了数据的正确性。

所以要想用好volatile,就要保证操作的原子性。

Java并发编程--volatile关键字 引言 很久之前就想写volatile关键字,但是迟迟没有动笔,主要是volatile涉及到的东西有点多,讲不清楚倒还好,就怕反而把读者绕晕了,哈哈。 volatile关键字是为了保证内存可见性的,首先介绍并发编程中涉及到的3个问题: 并发编程规则 原子性 原子具有不可分割性,所谓原子性,指的是一个或多个操作,要么全部执行且执行过程不会被任何因素打断,要么就全部执行,其与事务的语义是一致的。 比如经... 阅读详情

相关推荐

pynq-z2 HLS开发

定制Overlay一.用HLS生成一个定制IP功啊啊是合理的创建标题,有助于目录的生成如何改变是式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一.用HLS生成一个定制IP ...

qq_38769280的博客 4156

java call类_java11教程--类CallSite用法

CallSite是变量MethodHandle的持有者 ,其名称为target 。链接到CallSite的invokedynamic指令委托对站点当前目标的所有调用。CallSite可以与若干invokedynamic指令相关联,或者它可以是“自由浮动”,与无关联。在任何情况下,都可以通过名为dynamic invoker的关联方法句柄调用它。CallSite是一个抽象类,不允许用户直接子类化。 ...

weixin_39797912的博客 1265

AD20.多对多工程中将某个原理图导入PCB工程

AD20将多个原理图中的一个或多个导入到PCB文件中

鬼爷杂货铺 1万+

JVM invokedynamic调用指令

转载请注明链接: JVM invokedynamic调用指令 版本号:2018/09/15-1(0:00) JVM invokedynamic调用指令 基础-方法句柄(32) 赛马问题 方法句柄 创建 操作 方法句柄的实现 方法句柄性能 invokedynamic调用指令(28) 调用点 invokedynamic使用实例 Java8 Lambda表达式 Lambda...

feather(猎羽) 1828

群晖NAS安装HomeAssistant保姆级教程:从Docker部署到智能设备接入

本文提供了一份详尽的群晖NAS安装HomeAssistant保姆级教程,涵盖从Docker部署到智能设备接入的全过程。通过规划存储路径、配置容器环境变量和网络模式,确保系统稳定运行。教程还介绍了如何接入小米、苹果HomeKit等智能家居设备,并利用自动化与仪表盘打造本地化、高响应速度的智能中枢,实现数据隐私与远程控制的完美平衡。

play7的博客 694

【WILEY】wiley期刊投稿详解:从revision到Accepted全流程实例讲解

注意:包括没标注修改位置的word文件和标注了修改位置的word文件。

Everyday try to become better -Kobe Bryant 1万+

为什么volatile使用比synchronized少

在多线程编程中,我们最常用的是synchronized,而对volatile的使用,却相对较少。这一方面是因为volatile的使用场景限制,另一方面是volatile使用需要更高的技术...

XMEHB的博客 269

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 401

JDK7动态方法调用

在JDK7中,Java提供了对动态语言特性的支持,实现了JSR 292 《Supporting Dynamically Typed Languages on the Java Platform》规范,这是Java语言发展的一重大进步,而提供对动态语言特性支持也是Java发展的一大趋势与方向。那么动态性表现在哪里呢?其一在Java API层面,新增了java.lang.invoke包,主要包含了Ca

云原生之家 4774

opencv 双目摄像头拍照(分别左右镜头拍照)

准备一个usb线的双目同步摄像头: 运行环境是vc2015,opencv3.1。 将左右两个摄像头拍到的图片分别保存起来。 1)适用条件 双目同步摄像头(两个镜头,共用一个设备ID) 使用语言:C++ 、opencv库 摄像头 分辨率2560*960 或以上。 源程序: #include"stdafx.h" #include<iostream&g...

黎国溥 1万+

【示波器专题】示波器探头的原理深入——有源探头之单端有源探头

由于接地环路的苛刻要求,更高带宽的单端有源探头就算设计了也不实用。因此单端有源探头的带宽一般在6GHz以内,更高带宽的信号测量也只能使用差分有源探头(市面上有些型号的差分探头可同时兼顾单端测试)。......

一点硬件 2145

java mutable_java11教程--类MutableCallSite用法

A MutableCallSite是CallSite,其目标变量的行为类似于普通字段。链接到MutableCallSite的invokedynamic指令委托对站点当前目标的所有调用。可变调用站点的dynamic invoker还会将每次调用委派给站点的当前目标。下面是一个可变调用站点的示例,它将状态变量引入方法句柄链。MutableCallSite name = new MutableCallS...

weixin_30753213的博客 360

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1649

【JUC并发编程 】 详解Java关键字之 volatile

Java的关键字 volatile 你了解多少呢,详解 volatile!

wanghuichen的博客 1534

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模

u011396148的博客 1753

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java并发编程—volatile

volatile

且将&的博客 290

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java并发编程中的Synchronized与volatile

1.背景介绍 1. 背景介绍 Java并发编程是一种编程范式,它允许多个线程同时执行多个任务。这种并发编程方式可以提高程序的性能和效率。在Java中,我们可以使用Synchronized和volatile两种关键字来实现线程同步和原子操作。 Synchronized是Java中的一个关键字,它可以用来实现同步块或同步方法。当一个线程在执行一个同步块或同步方法时,其他线程不能访问该同步块或同步...

AI天才研究院 1148

JAVA并发编程volatile核心原理

上文说到synchronized,,虽然被评为并发全能王,不过用起来也是格外注意,不能搞大力出奇迹那一套,容易出现性能问题。比如synchronized是无法控制阻塞时长,阻塞不可中断问题;以及锁范围,修饰方法或代码块,要精细,仅修饰需要并发控制部分,降低锁粒度。文末再总结一下,synchronized和volatile的区别,先进入正题,聊聊正主:volatile。volatile是轻量级的并发解决方案,不会阻塞线程,是一种简单的同步机制。

拉丁解牛技术专栏 1461

Java面试内容精讲—并发编程volatile

前言 观看链接:https://www.bilibili.com/video/BV1RC4y1h7YU。 课程总体说明 介绍的是有关于并发编程下的volatile关键字的使用; 并发编程一直是java实际开发当中一个非常重要的内容,同时也是一个难以理解的内容; 在实际开发中或者是在面试中经常被面试官问到关于并发编程的知识点;volatile就是其中一个比较热门的知识点,也是相对于来说比较难以理解的知识点; 在介绍volatile关键字之前,先来了解一下并发编程的背景; 并发编程是在互联网的背景下,当我们的系

qq_43409111的博客 234

Java 并发编程的艺术 - volatile

Java 并发编程的艺术 - volatile 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用适当的话,它比synchronized的使用和执行成本更低,因为它不会引起上下文的切换和调度。 volatile的定义与实现原理 Java编程语言允许线程访问共享变量,是为

Welocme 172

Java并发编程之volatile关键字

从事Java编程的程序员若想有所成长,就肯定绕不过并发编程,今天就聊一聊在Java并发编程中volatile关键字。 以下是本文的目录大纲: 一. 并发编程中的三个概念 二. 为什么没有退出循环 三. 进一步认识volatile关键字 四. volatile关键字的使用场景 五. 一道面试题 一. 并发编程中的三个概念 在并发编程中,我们通常需要考虑三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念: 原子性 原子性是指一个操作或者多个操作 要么全部执行并且执行的

成长笔记 297

Java并发编程-Volatile

Java并发编程-VolatileJava并发编程Volatile的应用Volatile的定义与实现原理线程与主内存的通信Volatile的两条实现原则Lock前缀指令会引起线程缓存回写到内存一个线程的缓存回写到内存会导致其他处理器的缓存无效 Java并发编程 Java代码在汇编后会变成Java字节码,字节码被类加载器加载到JVM里,JVM将字节码转化为指令码在CPU上执行,所以Java中使用的并...

Jeffrey的博客 349
上一篇: Java并发编程 之 同步队列与等待队列
下一篇: Java并发编程 之 HashMap线程不安全
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值