浅谈Java并发编程系列(七) ——— 深入解析synchronized关键字

深入解析Java中的synchronized关键字 接下来是偏向锁,我们还是用同样的代码即可,需要注意的是偏向锁必须在jvm启动后的一段时间才会运行,所以如果我们想打印偏向锁必须让线程休眠那么几秒,这里笔者就偷懒了一下,通过设置jvm参数。打印结果如下,我们只需关注第一行的object header,可以看到第一列的00000001,我们看到后3位为001,偏向锁标记为0,锁标记为01,001这就是我们说的无锁状态。上文讲解锁升级的之后,我们一直在说对象头的概念,所以为了能够直观的看到锁对象中对象头锁标记和锁状态的变化,我们这里引入一个jol工具。 阅读详情

Synchronized关键字

synchronized的锁机制的主要优势是Java语言内置的锁机制,因此,JVM可以自由的优化而不影响已存在的代码。

任何对象都拥有对象头这一数据结构来支持锁,但是对于较大的对象系统开销会更大一些。

java中的每一个对象都至少包含2个字(2*4 Bytes for 32bits & 2*8 Bytes for 64bits, 不包括已压缩的对象)。第一个字被称为Mark Word。这是一个对象的头,它包含了不同的信息,包括锁的相关信息。
第二个字是指向metadata class的指针,metadata class字义了对象的类型。这部分也包含了VMT(Virtual Method Table)。

Mark Word 的结构如下所示:

mark word

Mark Word根据最低两位(Tag)的所表示的状态,编码了不同的信息。
如果这个对象没有被用作锁,Mark Word 记录了hashcode和对象年龄(for GC/survivors)。
除此之外,有3种状态对应锁:轻量级锁,重量级锁和偏向锁。

经量级锁

所有现代JVM都引入了经量级锁:

  • 避免将每个对象关联操作系统的mutex/condition变量(重量级锁)

  • 当不存在锁竞争时,使用原子操作来进入退出同步块

  • 如果发生锁竞争,回退到操作系统的重量级锁

引入轻量级锁会提供锁效率,因为大部分锁都不存在竞争。

经量级锁的加锁过程:

  • 当一个对象被锁定时,mark word被复制到当前尝试获取锁的线程的线程栈(Execution stack)的锁记录空间(lock record), 被复制的mark word官方称为displaced mark。

  • 使用CAS操作来尝试使 mark word指向当前线程的锁记录空间(即在mark word中存入使用当前线程锁记录空间的指针——stack pointer)。

  • 如果CAS操作成功,则线程获得锁。

  • 如果CAS操作失败,即表明存在锁竞争,则发生锁膨胀,回退到重量级锁。

  • 锁记录空间中记录了被当前执行方法锁定的对象(通过遍历线程栈找到线程的锁对象)

经量级锁加锁前:
Light-weight Locking : Before

经量级锁加锁后:
Ligth-weight Locking : After

经量级锁的解锁过程:

  • 解锁使用CAS来把displaced mark写回对象的mark word中。

  • 如果CAS失败, 表示发生锁竞争:则锁膨胀。(通知其他等待线程锁已释放)

  • 将锁记录空间置为0:如果发生锁膨胀,则用0替换displaced mardk,如果不存在竞争,则CAS将锁记录空间置为0后,停止CAS操作。

偏向锁

偏向锁的引入:

  • 在多处理器上CAS操作可能开销很大。

  • 大多数锁不仅不存在竞争,而且往往由同一个线程使用。

  • 使单独一个线程获取锁的开销更低。

  • 代价是使另一个线程获取锁开销增大。

偏向锁加锁过程:

当锁对象第一次被线程获取时,VM把对象头中的标志位设为101,即偏向模式。同时使用CAS把获取到这个锁的线程ID记录在对象的mark word中,如果CAS成功,则持有偏向锁的线程以后每次进行这个锁相关的同步块时,不再进行任务同步操作,只进行比较Mark word中的线程ID是否是当前线程的ID。

偏向锁的解锁过程:

当另外一个线程去尝试获取这个锁时,偏向模式结束。根据锁对象目前是否处于被锁定状态,撤销偏向后恢复到未锁定或经量级锁定状态。

VM会停止持有偏向锁的线程(实际上,VM不能停止单一线程,而是在安全点进行的操作)。
遍历持有偏向锁的线程的栈,找到锁记录空间,将displaced mark 写入到最旧的锁记录空间,其他的写0。
更新锁对象的mark word。如果被锁定,则指向最旧的锁记录空间,否则,填入未锁定值。

偏向锁的特点:

  • 偏向于第一个获取锁的线程:

    • 在mark word的Tag中增加一位
    • 001表示无锁状态
    • 101表示偏向或可偏向状态(thread ID ==0 == unlock)
    • 通过CAS来获取偏向锁
  • 对于持有锁的线程接下的锁获取和释放开销非常小(仅仅判断下,不需要CAS同步操作)。

  • 如果另一个线程锁定了偏向锁对象,则偏向锁收回,升级为轻量级锁(增加了另一个线程获取锁的开销)。

语音AI Agent落地实战:从ASR-NLP-TTS到多通道协同决策 语音AI Agent并非简单的自动语音识别(ASR)、自然语言处理(NLP)和文本转语音(TTS)三模块串联,而是在真实场景中需兼顾实时性、鲁棒性与隐私合规的端到端交互系统。其核心原理在于打破‘文本中间态’依赖,通过声学-文本-上下文多通道协同决策,融合原始音频特征、N-best置信度与设备环境信号,实现动态意图推演。技术价值体现在低延迟(如120ms离线唤醒)、高抗噪(-5dB SNR下WER≤25%)及强可控性(断网降级、本地热更新)。典型应用场景覆盖车载语音、智能家居与银行网点等边缘受限环境,尤其适用 阅读详情

相关推荐

AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了

这篇教程介绍了如何使用Python+OpenCV+MediaPipe搭建入门级人体姿态识别系统。主要内容包括:人体姿态识别的应用场景(如健身APP、体感游戏)、开发环境搭建(安装Python、OpenCV和MediaPipe库)、核心代码实现(通过30行代码完成摄像头姿态检测),以及进阶功能开发(深蹲动作纠正算法和PPT体感控制器)。教程详细解析了MediaPipe的BlazePose模型架构和33个关键点的生理学意义,并提供了多线程优化等性能提升方案。该项目适合AI初学者实践,无需复杂算法即可实现实时人体

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1551

synchronized锁的膨胀过程详细介绍

synchronized锁的膨胀过程详细介绍

java架构师分享,有问题可以联系我 780

车辆TBOX科普 第64次 TBOX系统集成测试与文档编写

汽车电子开发中,TBOX作为核心网关面临独特挑战:需处理多网络接口、满足严苛安全标准并确保10年以上可靠性。项目文档是开发流程的核心资产,必须与编码同步更新,构建从需求到测试的完整闭环。系统集成测试需分层进行,结合硬件在环测试和自动化工具,并严格管理缺陷。文档与测试深度协同,通过追溯矩阵确保每个需求都被覆盖验证。最终交付不仅是软件包,更是一套包含完整验证报告的信任体系。这种严谨的工程纪律,是将代码转化为车规级可靠产品的关键保障。

IT深耕十余载,大道之简 1320

全面详解Java并发编程:从基础到高级应用

Java并发编程提供了强大的工具和框架,帮助开发者有效管理多线程任务,提升应用程序性能。理解并掌握基本概念、线程管理、同步机制和高级并发工具,并遵循最佳实践,可以编写出高效、安全、可靠的并发程序。

微笑听雨 1万+

Redis TLS 加密传输实战:从证书生成到安全配置

本文详细介绍了为Redis启用TLS加密传输的完整实战流程。从阐述TLS加密的必要性开始,逐步指导读者生成自签名CA和服务器证书,并深入解析Redis服务端的核心安全配置,包括端口设置、认证模式与性能优化。最后,提供了主流客户端连接示例及生产环境下的排错与运维最佳实践,帮助构建安全的Redis通信通道。

weixin_29274969的博客 515

滚动轴承振动信号特征解析与故障诊断模型构建

本文深入解析了滚动轴承振动信号的三大来源与特征,并详细阐述了从时域、频域到时频域的特征提取方法。通过构建基于机器学习(如随机森林、SVM)或深度学习的故障诊断模型,结合实战代码示例,为设备维护工程师提供了一套从信号分析到智能诊断的完整解决方案,旨在实现精准的故障识别与预测性维护。

qsc901234567的博客 368

synchronized锁膨胀过程

锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。JDK1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。

道阻且长,行则将至! 716

Knewton自适应学习平台实战:如何用大数据打造个性化教育体验

本文深入解析Knewton自适应学习平台如何利用大数据技术构建个性化教育体验。通过多维度数据采集、动态认知诊断模型和智能推荐系统,平台能精准识别学生知识盲区,提供定制化学习路径。实战案例显示,该方案显著提升完课率并优化学习效率,展现了自适应学习技术的教育变革潜力。

info6的博客 505

Java并发编程(线程基础概念、三大特性、锁、阻塞队列)详解

什么是进程?进程是指运行中的程序。 比如我们使用钉钉,浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。什么线程?线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某个片段。举个栗子:房子与人比如现在有一个100平的房子,这个方式可以看做是一个进程房子里有人,人就可以看做成一个线程。人在房子中做一个事情,比如吃饭,学习,睡觉。这个就好像线程在执行某个功能的代码。所谓进程就是线程的容器,需要线程利用进程中的一些资源,处理一个代码、指令。最终实现进程锁预期的结果。进程和

yqqの博客 787

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

Access查询中的Dlookup函数的妙用

在Microsoft Access中,处理和分析数据的过程中,常常会遇到需要根据条件从其他记录中提取特定数据的情况。这时候,Dlookup函数就成了开发者和数据分析师的得力助手。今天我们将通过一个具体的实例,详细探讨如何利用Dlookup函数来解决复杂的查询问题。

m0_62153576的博客 294

Java并发编程详解

深入浅出地讲解了Java并发编程中的一些概念,比如AQS等等

weixin_55658418的博客 455

OceanBase全局索引深度解析:分布式环境下的高效索引设计与实战优化指南

全局索引(Global Index)是OceanBase数据库在分布式环境中提供的一种跨分区、跨服务器的索引结构,它允许用户创建跨越多个分区的索引,为分布式查询提供高效的数据访问路径。与局部索引(Local Index)不同,全局索引不是与表分区一一对应的,而是作为一个独立的逻辑结构存在。 在分布式数据库系统中,全局索引解决了以下几个关键问题: 跨分区查询性能:当查询条件不包含分区键时,全局索引可以避免全表扫描 唯一性约束维护:全局索引能够保证索引键在全局范围内的唯一性 分布式事务支持:全局索引与主表数

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 717

java重量级锁回退轻量级_浅谈Java并发编程系列(七) —— 深入解析synchronized关键字...

Synchronized关键字synchronized的锁机制的主要优势是Java语言内置的锁机制,因此,JVM可以自由的优化而不影响已存在的代码。任何对象都拥有对象头这一数据结构来支持锁,但是对于较大的对象系统开销会更大一些。java中的每一个对象都至少包含2个字(24 Bytes for 32bits & 28 Bytes for 64bits, 不包括已压缩的对象)。第一个字被称为M...

weixin_35773130的博客 354

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java并发编程必备:Synchronized关键字深入解析

在Java多线程编程中,线程安全是非常重要的一个概念。为了防止多个线程同时访问共享资源时出现数据不一致或其他竞态条件问题,Java提供了关键字和监视器锁(Monitor Lock)机制。这个博客将深入探讨的原理、使用场景以及与监视器锁的关系。通过本文,我们深入探索了Java中的关键字,包括其互斥性和可重入性的特性。文章详细介绍了的三种使用方式:修饰代码块、修饰普通方法和修饰静态方法。同时,我们还解析了监视器锁(Monitor Lock)的底层实现,以及与的对比。

2302_81090306的博客 1186

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

synchronized关键字的使用

synchronized关键字是java并发编程中常使用的同步锁,用于锁住方法或者代码块,锁代码块时可以是synchronized(this){}、synchronized(Object){}、synchronized(类class){}。 当锁住的内容执行完或者在执行过程中抛出异常,才会自动释放锁。如果想手动释放锁,需要调用锁住的对象的wait()方法释放掉锁并且置于等待状态,切换到其他线程运...

yjclsx的博客 9522

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 并发编程深度解析:synchronized 关键字的内部原理与应用

synchronized 锁的底层原理

码上一元 1546

JAVA并发编程——synchronized关键字

Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如volatilefinalconcurren包等。关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用synchronized来完成。海明威在他的《午后之死》说过的:“冰山运动之雄伟壮观,是因为他只有八分之一在水面上。”对于程序员来说,只是个关键字而已,用起来很简单。

L170311的博客 1226

并发编程-synchronized关键字

摘要:synchronized关键字是Java实现线程同步的核心机制,提供原子性、可见性和有序性保证。其三种基本用法包括同步实例方法、同步静态方法和同步代码块。synchronized基于对象头中的MarkWord实现锁状态管理,包含四种锁状态:无锁、偏向锁(适用于单线程访问)、轻量级锁(CAS自旋优化)和重量级锁(操作系统互斥锁)。锁会根据竞争情况动态升级,从偏向锁逐步升级到重量级锁,这种设计在JDK1.6后大幅提升了并发性能。每个Java对象都关联一个Monitor监视器,包含锁状态和等待/通知机制,实

m0_51751350的博客 1936

[Java并发编程] Java开发必须知道的synchronized关键字

在Java后台开发或者Android开发中,synchronized出现的频率并不算低。本文就什么是synchronized,如何使用synchronized以及synchronized的实现原理做深入的讲解,揭开synchronized神秘面纱,有助于大家掌握synchronized的用法并深谙synchronized深层原理,提升并发编程能力,写出更高性能的程序。

qq_27752085的博客 1067

浅谈Java并发编程

最近看了看并发编程相关的一些书籍和文章,想谈一谈自己对于并发编程的一些理解和看法,一些浅薄之见,如有不对的地方还请大家批评指正。想要讲清楚一件事,我认为最重要的是以下几点:what?这个东西是啥?why?为什么有了这个东西?这个东西是用来干啥的?解决什么问题?how?这个东西为了解决问题,是怎么做的?只要能把这几点讲清楚,整个事情就一目了然了。今天,我们就用这个框架,来聊一聊并发编程。

itigoitie的博客 1081

Java并发编程:如何正确使用 volatile、synchronized 和 final 关键字

本文介绍了 Java 中的 volatile、synchronized 和 final 三个关键字的作用、原理以及使用场景。volatile 关键字可以保证可见性和有序性,synchronized 关键字可以保证可见性和有序性,同时还可以保证原子性,final 关键字可以保证变量的不可变。在实际开发中,需要根据具体的需求选择合适的关键字来保证程序的正确性和性能。

乐只悠悠 1254

【并发编程】全面解析volatile和synchronized关键字

偏向锁会偏向第一个获得它的线程,如果接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程不需要再进行同步。的低两位用于表示锁的状态,分别为"01"(无锁状态)、“01”(偏向锁状态)、“00”(轻量级锁状态)和"10"(重量级锁状态)。是相对基于OS的互斥量实现的重量级锁而言的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用OS的互斥量而带来的性能消耗。锁粗化是指将多个连续的、临近的小范围锁操作合并为一个更大的锁操作,以减少加锁和解锁的频率,从而提高性能。

k123456kah的博客 1279

Synchronized关键字详解

文章目录一、Synchronized的使用1.1对象锁1.2类锁二、Synchronized原理分析2.1加锁和释放锁的原理 引入背景 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点 一是存在共享数据(也称临界资源) 二是存在多条线程共同操作共享数据。 因此为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再进行,这种方式有个高尚的名称叫互斥锁,即能达到互斥访

H_xxxxd的博客 5424

Java并发编程—synchronized关键字

介绍synchronized关键字

weixin_64451672的博客 777

深入解析 Java 中的 synchronized 关键字

Java 的 synchronized 关键字是多线程编程中确保线程安全的核心机制。它通过互斥锁提供互斥性(一次只有一个线程访问共享资源)、可见性(线程间内存同步)和可重入性(同一线程可多次获取同一锁)。synchronized 是 JVM 内置的,简单易用,但灵活性较低,缺乏如超时锁或公平锁等高级功能。

持续输出Java相关知识 1389
上一篇: mybatis自定义typeHandler映射对象为JSON
codershamo
博客等级 码龄10年 22粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值