Java并发编程 - volatile, synchronize关键字实现原理

synchronized和volatile关键字实现和底层原理详解 需要有一个地方来存储抢占锁的标记,否则当其他线程来抢占资源时,不知道当前是应该正常执行还是应该排队。实际上,这个锁标记是存储在对象头中的。 阅读详情

Java代码在编译后会变成Java字节码, 字节码被ClassLoader加载到JVM中, JVM执行字节码, 最终要转化为汇编指令在CPU上执行,
Java中所使用的并发机制依赖于JVM的实现和CPU的指令.

volatile原语

volatile是轻量级的synchronized, 它在多CPU(注意不仅仅是多核)开发中保证了共享变量的可见性.

由于volatile只保证了可见性, 无法保证原子性, 所以比synchronized的执行成本更低, 它不会引起上下文的切换和调度.

volatile实现原理

为加快CPU的处理速度, 它是不直接与内存进行通信, 而是先将系统内存的数据读到CPU内部缓存(L1, L2或其他)后再进行操作,
但操作完全不知道何时会写回内存.

被volatile标注的变量如果被修改了, 会引起一系列的变化:

  1. 当前操作的的CPU会强制将缓存行中的变化立即写回到内存中;
  2. 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据立即失效, 也就是其他CPU如果需要再使用这个变量,
    需要重新到内存中读取到CPU缓存中;

synchronized原语实现原理与应用

Java中的每一个对象都可以作为锁

JavaSE 1.6中, 锁一共有四种状态, 级别从低到高依次为: 无锁状态, 偏向锁, 轻量级锁, 重量级锁. 当低级的锁机制不适配的时候, 程序会自动将锁升级为高级别的锁.

偏向锁

偏向锁使用了一种等到竞争出现才释放锁的机制, 所以当其他线程尝试竞争偏向锁时, 持有偏向锁的线程才会释放锁.

轻量级锁

在竞争锁的时候, 不会阻塞, 而是使用’自旋’机制反复尝试获取锁(始终消耗CPU时间片), 直到获取锁.

重量级锁

就是JavaSE 1.6之前的锁机制

锁的优缺点对比

类别优点缺点适用场景
偏向锁和执行非同步的方法相比仅存在纳秒级的差距如果线程间存在锁竞争, 则会带来额外的锁撤销的消耗适用于长期只有一个线程访问同步块的场景
轻量级锁竞争锁的线程不会阻塞, 提高了程序的响应速度竞争的线程会自旋, 消耗CPU追求响应时间, 且同步块执行速度非常快的场景
重量级锁竞争锁的线程不自旋, 不会消耗CPU竞争锁的线程会阻塞, 相应时间缓慢追求吞吐量, 或者是同步块执行时间较长的时候

原子操作的实现原理

原子操作的定义是:

不可被中断的一个或者一系列操作

CPU如何实现原子操作

总线锁

使用处理器提供的一个LOCK#信号, 当一个处理器在总线上输出此信号时, 其他处理器的请求将被阻塞, 那么该处理器可以独占共享内存.

缓存锁

同一时刻, 我们只需要保证对某个内存地址的操作是原子性的即可

Java如何实现原子操作

Java中可以通过锁和循环CAS(Compare and Set)的方式来实现原子操作, 具体的表现形式是内置了一些类来支持原子操作: 如AtomicBoolean,
AtomicInteger, AtomicLong等

CAS实现原子操作的问题
  • 循环开销大:

    自旋CAS如果长时间不成功, 会给CPU带来非常大的执行开销

  • 只能保证一个共享变量的原子操作

    如果一个类有两个以上的field时, 就需要使用锁了.

使用锁机制来实现原子操作

实际上线程操作锁的方式在底层也是使用循环CAS的方式来进行锁的获取和释放的.

聊聊并发(一)深入分析Volatile的实现原理 NULL 博文链接:https://kiral.iteye.com/blog/1416354 立即下载

相关推荐

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程)

本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。

grpc6streamer的博客 1174

volatile与synchronized实现原理

参考文章:https://www.cnblogs.com/charlesblc/p/5994162.html ------------------------------------------------------------------   刚开始认识volatile的时候,觉得对它的一些特性非常迷惑。比如:具有可见性,如果一个线程修改了volatile变量的值,那么...

afz8572的博客 626

大模型运维实战:从GPU选型到推理服务稳定落地

大模型服务进入生产环境后,运维对象从传统进程转向GPU显存、KV Cache、推理吞吐等动态资源。显存利用率、首token延迟、并发队列深度等指标,直接影响模型服务的质量与成本。理解推理框架的内存分配机制、掌握监控告警与自动化扩容手段,是保障服务稳定的关键。这类能力广泛应用于企业私有化部署、智能客服、知识库问答等场景,帮助运维团队从被动救火转向主动容量规划与性能调优。本文围绕大模型运维的完整路线,梳理从硬件选型、推理部署到监控排障的实战经验,并算清一份真实项目的长期成本账。

weixin_29054245的博客 238

if null 锁 java_Java锁的那些事儿

Java多线程开发中,如果涉及到共享资源操作场景,那就必不可少要和Java锁打交道。Java中的锁机制主要分为Lock和Synchronized,本文主要分析Java锁机制的使用和实现原理,按照Java锁使用、JDK中锁实现、系统层锁实现的顺序来进行分析,话不多说,let's go~Java锁使用在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而JavaSE 5...

weixin_30523059的博客 790

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 749

直流无刷BLDC六步换相“电流环”、“速度环”的关系

4、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载非正常变化,例如速度严重“超速”时,需要“限速”保护,这个任务是“速度环”的,这时“速度环”会根据设定的速度上限,控制触发器,将电机速度迅速将下来,电流降下来,在“限速”保护期间,“电流环”失去对触发器的控制作用;3、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载正常变化,“速度环”对速度大小的控制作用是没有的;6、很多人想当然,“电流环”不工作,电机“电流”哪里来的?

u011878611的博客 5471

synchronized与volatile原理分析

synchronized与volatile synchronized实现原理: 1、Java代码层面上,用于锁定一个代码块只能同时被一个线程访问; public class synchronizedTest { public void method(){ synchronized(this){ Object o = new Object(); } } } 2、虚拟机层面上,通过锁定和解锁某个监视器来同步变量的值; synchroni

weixin_42243823的博客 278

OpenCV和Halcon分别实现彩色图像的白平衡效果

实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象 1、OpenCV #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat g_srcImage,dstImage; vector<Mat> g_vChannels; g_srcImage = im...

$firecat利白的代码足迹$ 2829

深入分析Volatile的实现原理

1、引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,下面我们将深入分析Voliate的实现原理。2、Volatile定义java编程语言允许

eff666的博客 8463

【Unity】RPG2D龙城纷争(十九)流程与UI界面(终章)

本章为RPG2D系列的终章,在之前的章节中我们已经完成了游戏的所有基本功能,那么用流程与UI界面将其串联起来才是我们整个游戏原型完善的标志。

神码编程 917

【异常】XXL-job触发调度:address:http://192.168.x.x:x/ code:500 msg:xxl-rpc remoting error(connect timed out)

XXL-JOB调度任务失败分析:调度中心(10.254.234.80)与执行器(192.168.x.x)连接超时,返回500错误。主要原因是网络不通或执行器异常:1.网络不通可能由防火墙或网段隔离导致;2.执行器未启动或端口未监听;3.地址配置错误。解决方案:1.关闭代理使用内网;2.测试网络连通性和端口可用性;3.检查执行器进程状态和端口监听情况;4.核对执行器地址配置;5.必要时配置防火墙规则放行端口。

奶爸的编程之路,也就一周冷个三天 414

volatile底层实现原理详解

小伙伴都知道可以使用 volatile 达到保证可见性和指令重排的目的,对他的认知很多小伙伴也仅限于会用阶段,但是对其实现原理并不是很清楚,为了加深学习和理解今天写了这篇总结一下。 下面我们来段代码看一下: final static int MAX = 50; static int value = 0; public static void main(String[] args) { //读数据线程 new Thread(()->{

养歌的博客 1654

【Bug已解决】claude: command not found 解决方案

方案适用场景推荐指数添加 PATH全局 bin 目录确实存在但未加入 PATH⭐⭐⭐⭐⭐nvm 重新安装多 Node 版本切换导致失效⭐⭐⭐⭐⭐Windows 环境变量检查Windows 平台专用⭐⭐⭐⭐原生安装脚本想彻底避开 npm PATH 问题⭐⭐⭐⭐清理多重 Node 安装系统里有多套 Node 管理方式冲突⭐⭐⭐报错的核心是npm 全局安装的可执行文件路径没有正确出现在系统的 PATH 环境变量里,而不是安装本身失败了。

一键难忘的博客 1万+

【Android面试】2023最新面试专题七:Java并发编程(二)

6 ReentrantLock的实现原理详细讲解享学课堂移动互联网系统课程:架构师筑基必备技能《深入理解并发编程-AQS与JMM》这道题想考察什么?是否了解并发相关的理论知识是否对于锁机制有个全面的理论认知是否对于AQS原理有自己的理解考察的知识点锁的分类(公平锁、重入锁、重力度锁等等)ReentrantLock实现方式与...

weixin_41390810的博客 109

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《Java并发编程的艺术》笔记 ------ java并发机制底层实现原理

java实现并发方式 jdk的关键字: volatile和synchronize 原子操作 volatile定义和实现原理 定义:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性更新,线程应该确保通过排它锁单独获取这个变量。(java中一个变量被声明称volatile,java线程内存模型确保所有线程看到变量变化后的值 并且保持一致) volatile实现可见性方式:...

qq_42725307的博客 232

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java并发

1、 volatile 关键字 volatile是一个类型修饰符的指令关键字。 程序运行时,各个线程会将变量从主存拷贝到工作内存中,这就导致了工作内存中修改的变量值并不能实时和 主存中的值保持一致,当多线程同时操作时就会出现脏读现象。volatile避免了这一现象。在对volatile修饰的变量进行写操作是,会添加lock指令,当前运行内存修改后会实时写回系统内存。synchr...

ZXDstart的专栏 180

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

并发编程三大特性及java锁相关知识

java多线程

haojunliang_hao的博客 248

多线程(二)

共享内存中多线程进行读写操作的行为规范。

weixin_54256249的博客 316

多线程的一些知识点

并发/线程的一些概念,概念很重要,没有理论指导的话会导致理解不够全面多线程问题的本质 -- 有序性,可见性,原子性synchronize的底层实现volatile的底层实现无锁算法的底层实现 -- CAS原子变量的实现final关键字的新含义 深入理解Java内存模型指令重排序和内存屏障顺序一致性和Happens-before规则一些基本的硬件知识一些处理同步问题的技术

pifengyz的专栏 274

Synchronize和Volatile底层实现原理

最近在看并发编程的艺术这本书,希望加深对并发这块的理解。毕竟并发相关还是十分重要的。本文主要是关于第二章Java并发机制的底层实现原理的相关记录。主要包括volatile,synchronized,原子操作等实现原理的分析。 点击阅读更多系列文章我的个人博客–&amp;amp;gt;幻境云图 1. 上下文切换 多线程 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。...

探索云原生 3101

volatile 与 synchronize 详解

Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...

Woo_home的博客 2万+

Java并发编程——volatile和synchronize详解

volatile 可见性,是否具备原子性、原理介绍,synchronized使用方法、原理、锁升级过程介绍

共勉 1014

Java并发编程:volatile关键字解析。以及volatile和synchronize的区别

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

xiaaiwu的专栏 3709

【Java并发编程的艺术】读书笔记——Java并发机制的实现原理(volatile和synchronized)

学习参考资料:《Java并发编程的艺术》 文章目录1.volatile1.1volatile定义1.2volatile实现原理2.synchronized2.1synchronized简介2.2对象头2.3锁的升级2.4锁的对比3.原子操作的实现原理3.1什么是原子操作?3.2Java如何实现原子操作 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。 1.volatile .

遇事不决问清风的博客 775

Java多线程、synchronize原理

进程和线程有什么区别 synchronize 的本质是什么 死锁是什么 乐观锁和悲观锁是什么 volatile 关键字有什么作用 本篇记录Java多线程和线程同步(synchronize),带着问题学习才是最有效的方法。下面会对上述问题由浅入深,进行原理性的讲解,大部分会用最简单的例子讲解到原理。理解了才是自己的知识。 开启线程 先来个最简单的如何开启一个新线程: Thread thread...

MaBiAHaiWang的博客 1728

Java并发编程之volatile和synchronized原理

Java并发编程之volatile和synchronized原理

csdn15917204572的博客 833
上一篇: Java - 迭代器的使用
下一篇: Java解惑 - sleep和wait/notify机制, 线程阻塞和等待的区别
congyh
博客等级 码龄15年 43粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值