直通BAT必考题:详解Java多线程之Synchronized的底层实现

LabVIEW调用.so文件的方法 阅读详情

Java面试的时候经常会被问到Java多线程相关的问题,尤其喜欢问:

  1. synchronized的底层实现原理

  2. synchronized锁与JVM的关系

  3. synchronized的锁升级顺序

  4. synchronized的锁优劣势与应用场景

今天主要分享以上内容,详解synchronized的底层实现。​

Synchronized(同步锁)

synchronized 翻译为中文的意思是同步,也称之为”同步锁“。

synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。

Synchronized的使用

1.synchronized的3种使用方式

  • 修饰实例方法:作用于当前实例加锁

  • 修饰静态方法:作用于当前类对象加锁

  • 修饰代码块:指定加锁对象,对给定对象加锁

2.synchronized的代码范例

Synchronized的底层实现

synchronized的底层实现是完全依赖与JVM虚拟机的。

所以谈synchronized的底层实现,就不得不谈数据在JVM内存的存储:Java对象头,以及Monitor对象监视器。

1.Java对象头

在JVM虚拟机中,对象在内存中的存储布局,可以分为三个区域:

  • 对象头(Header)

  • 实例数据(Instance Data)

  • 对齐填充(Padding)

Java对象头主要包括两部分数据:

  • 类型指针(Mark Word):是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;

  • 标记字段(Klass Pointer):用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等,它是实现轻量级锁和偏向锁的关键.

2.Java锁对象存储位置

所以,很明显synchronized使用的锁对象是存储在Java对象头里的标记字段里。

3.Monitor

synchronized的对象锁,其指针指向的是一个monitor对象(由C++实现)的起始地址。每个对象实例都会有一个 monitor。

Monitor描述为对象监视器,可以类比为一个特殊的房间,这个房间中有一些被保护的数据,Monitor保证每次只能有一个线程能进入这个房间进行访问被保护的数据,进入房间即为持有Monitor,退出房间即为释放Monitor。

使用syncrhoized加锁的同步代码块在字节码引擎中执行时,主要就是通过锁对象的monitor的取用与释放来实现的。

4.线程状态流转

当多个线程同时请求某个monitor时,monitor会设置几种状态用来区分请求的线程:

  • Contention List:所有请求锁的线程将被首先放置到该竞争队列

  • Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List

  • Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set

  • OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck

  • Owner:获得锁的线程称为Owner

  • !Owner:释放锁的线程

下图反映了个状态转换关系

Synchronized 锁的升级

锁解决了数据的安全性,但是同样带来了性能的下降。hotspot 虚拟机的作者经过调查发现,大部分情况下,加锁的代码不仅仅不存在多线程竞争,而且总是由同一个线程多次获得。所以基于这样一个概率。

synchronized 在JDK1.6 之后做了一些优化,为了减少获得锁和释放锁来的性能开销,引入了偏向锁、轻量级锁、自旋锁、重量级锁,锁的状态根据竞争激烈的程度从低到高不断升级。

1.偏向锁

偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。

偏向锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要同步。

2.轻量级锁

如果明显存在其它线程申请锁,那么偏向锁将很快升级为轻量级锁。

3.自旋锁

自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

4.重量级锁

指的是原始的Synchronized的实现,重量级锁的特点:其他线程试图获取锁时,都会被阻塞,只有持有锁的线程释放锁之后才会唤醒这些线程。

偏向锁、轻量级锁、重量级锁优劣势比较

【MATLAB代码】UKF组合导航例程,15维状态量、3维观测量。附完整的代码,有中文注释、误差输出图像 摘要 本文提出了一种基于15维误差状态模型的UKF组合导航算法,实现了三维位置、速度和姿态的高精度估计。算法采用严格的误差状态模型,包含位置(3)、速度(3)、姿态(3)、陀螺偏差(3)和加速度计偏差(3)共15个状态量,通过3维GNSS位置观测进行校正。仿真结果表明,相比纯IMU积分,UKF算法能有效抑制误差积累,显著提高导航精度。文中提供了完整的MATLAB源代码,可直接运行并复现三维轨迹对比、位置/速度曲线及误差分析结果。 阅读详情

相关推荐

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 269

Synchronized同步锁

有关synchronized同步锁的介绍!

qq_49194786的博客 1977

如何使用Qt的PIMPL习惯用法(PIMPL Idiom

PIMPL是指“Pointer to IMPLementation”(指向实现的指针),意味着将实现细节隐藏起来,用户类无需关注这些实现细节。在Qt中常用PIMPL习惯用法来清晰地区分接口与实现,尽管Qt官方文档并未详细说明该机制。本文将演示如何在Qt中使用PIMPL习惯用法,并以一个简单的坐标输入对话框作为实例。

电脑管家 1035

synchronize锁详解

详解synchronize锁。 官方简介:同步方法支持一种简单的策略来防止线程受到干扰和内存一致性错误;如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成通俗点来说就是程序中用于保护线程安全的一种机制。

weixin_64366370的博客 3909

LFM调制信号分类与检测识别

支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗干扰(DDJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)。Faster-RCNN支持检测识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)等8种信号。

菜yuan~的博客 1030

GEE:面对对象土地利用分类(结合SNIC、GLCM 和机器学习算法)

本文将介绍在Google Earth Engine中结合SNIC、GLCM和机器学习算法的的土地利用/土地覆盖(LULC)分类方法。结果如下图所示,

养乐多的博客 5619

synchronized同步锁原理详解

当对象获取到锁之后,由于某些资源并未准备完成,需要等待其他线程去准备资源,此时线程会通过wait()/notify()等方法进入等待/通知模式,在这种情况下线程释放锁之后会进入WaitSet,当其他线程准备好资源之后会通知WaitSet中等待的线程,WaitSet中的线程会进入到EntryList中,重新参与锁竞争。锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁,但是锁的升级是单向的,只能从低到高升级,不会出现锁的降级。

qq_43648299的博客 2443

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

Synchronized Lock 锁 同步

如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。 字符串作为锁对象的参考 一、synchronized的性质 1、可重入性 官方解释:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获得该锁; 通俗解释:获得一次锁之后,如果调用其它同步方法,不需要重新获取锁,可以直接使用; 在方法1中调用方法2,两个方法都是同步方法,在获取方法1的锁之后,是可以直接调用方法2,而不需要重新获取锁,这就是可重入性,可重入性是线程范围,可以...

qq_30436011的博客 3587

鸿蒙接入微信支付 微信H5网页在鸿蒙系统的适配方法(含支付兼容方案) 微信H5适配鸿蒙系统 | ArkWeb识别 | 鸿蒙浏览器UA | 微信支付鸿蒙适配 | 鸿蒙微信判断方式

微信H5网页鸿蒙系统适配指南 针对微信H5网页在鸿蒙系统出现的兼容问题,本文提供完整适配方案。关键点包括: 环境识别:

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1301

168、OIS光学防抖系统设计:陀螺仪标定、音圈马达驱动与滚珠式/悬丝式结构选型

本文总结了OIS光学防抖系统设计中的关键问题与解决方案。作者通过实际案例指出,陀螺仪标定需重视零偏、灵敏度和温度补偿问题,音圈马达驱动需采用电流环控制并优化相位补偿。在机械结构选型方面,滚珠式适合大角度补偿但存在回差问题,悬丝式精度高但受重力影响,需根据应用场景选择。系统联调建议从开环到闭环逐步验证,注意陀螺仪与驱动频率匹配。最后给出5条经验建议:关注陀螺仪信噪比而非分辨率、预留标定余量、重视机械结构公差、配备专业调试工具、协调OIS与电子防抖的分工配合。文章强调OIS调试需针对不同模组特性进行反复测试与标

zzfmlxs的博客 46

synchronized同步锁

综上所述, 在sleep休眠过程中,当前线程不会让出持有的(“this”)锁,此时会出现异常情况,只有一个线程在执行,剩余线程处于Blockteb阻塞状态,而在wait计时等待过程中,当前线程会释放锁。思路:将数字,和字母分开,一个线程控制数字输出,另一个线程控制字母输出,即输出数字后,数字线程进入等待,同时唤醒字母线程,反之,输出字母时,字母程进入等待,同时唤醒数字线程。互斥锁实现线程之间的切换,需要从“用户态”切换到“内核态”,付出高昂的代价,会导致性能下降。只有一个线程执行的场景,使用偏向锁;

ji_xin0721的博客 1274

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

bat 存储过程返回值_直通BAT必考题系列:详解Java多线程之Synchronized的底层实现...

Java面试的时候经常会被问到Java多线程相关的问题,尤其喜欢问: synchronized的底层实现原理 synchronized锁与JVM的实现 synchronized锁升级顺序 synchronized锁的优劣势与应用场景今天主要分享以上内容,详解synchronized的底层实现。Synchronizedsynchronized 翻译为中文的意思是同步,也称之为”同步锁“。synchr...

weixin_39954569的博客 66

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

最难的 Java 虚拟机,高并发题全面解析(BAT 秋招面试必问)

本文主要针对秋招面试中出现的 Java 中并发包,JVM 中的底层难点、热点。助你们直通 BAT 压力面。主要包括以下内容: Java 关键字 Volatile 与 Synchronized 作用与区别,底层实现原理分别是 什么是死锁(Deadlock),如何分析和避免死锁 什么是线程安全,有哪些线程安全的集合,分别讲一下底层实现(cas) ThreadLocal 底层原理介绍一下 什么是线程池...

GitChat 415

NTscan扫描工具

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

史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

最全BAT必考题答案系列 最全MySQL面试60题和答案 史上最全Spring面试71题与答案 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等 分布式缓存Redis+Memcached经典面试题和答案 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁 Java并发编程系列:深入详解Synchronized同步锁的底层实现 高并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景 高并发编程...

一个有情怀的程序猿博客 439

c多线程并发处理方式_【直通BAT】Java多线程面试46题含答案:线程锁+线程池+线程同步...

在Java技术面试中,高频常问到的一些多线程面试题,整理分享给大家,既可用来准备技术面试,也可以作为线程知识点的梳理,温顾而知新。本文篇幅过长,建议收藏后慢慢细看,希望对大家扩充技术知识栈有所帮助!1、并发编程三要素?1)原子性原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。2)可见性可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后...

weixin_39651735的博客 148

Java虚拟机+并发包面试必问题全面解析

主要针对秋招面试中出现的 Java 中并发包,JVM 中的底层难点、热点。助你们直通 BAT 压力面。主要包括以下内容: Java 关键字 Volatile 与 Synchronized 作用与区别,底层实现原理分别是 什么是死锁(Deadlock),如何分析和避免死锁 什么是线程安全,有哪些线程安全的集合,分别讲一下底层实现(cas) ThreadLocal 底层原理介绍一下 什么是线...

mjy____MJY的博客 394

2019 最全阿里天猫Java 3面真题,含面试题答案!

1 阿里天猫Java一面 自我介绍 jvm GC原理,JVM怎么回收内存 ConcurrentHashMap是怎么解决并发问题的? HashMap怎么从链表转换为红黑树?如果存入的是null键,放在桶的哪个位置? 谈谈Synchronized与ReentrantLock的区别 再谈谈 threadLocal的实际应用 Java的内存模型,Java8做了什么修改 线程池中的几种重要的参数及流程说明 一次web请求响...

一个有情怀的程序猿博客 594

VMware Workstation 17 安装全指南:从虚拟化原理到实战避坑

虚拟化技术是现代软件开发、系统测试与安全研究的基础设施,其核心在于CPU硬件辅助虚拟化(如Intel VT-x/AMD SVM)与宿主操作系统内核级资源调度的协同。理解Hypervisor竞争、驱动加载机制和Windows功能嵌套关系,是解决兼容性问题的关键。VMware Workstation 17作为企业级桌面虚拟化标杆,深度适配Windows 11、WSL2及ARM64环境,同时引入驱动层授权校验、动态WHPX切换等新机制。本文围绕真实安装场景,解析硬件启用验证、Hyper-V共存策略、离线静默部署、

culuo8053的博客 553

Java 中 Synchronized 的基本用法和底层原理

Synchronized 是 Java 中常用的多线程同步机制,它基于对象监视器实现。每个 Java 对象都有一个关联的 Monitor,用于同步访问该对象。当一个线程访问一个被 Synchronized 修饰的方法或代码块时,它会尝试获取该对象的监视器。如果该监视器已被另一个线程占用,则该线程将被阻塞,直到监视器被释放。在实际应用中,我们可以使用 Synchronized 来确保多线程访问共享资源时的正确性和一致性。

徐师兄的博客 325

互联网大厂职级:P6/P7/P8技能、薪资和成长路线全攻略!

本文将深入探讨大厂职级中的 P6、P7、P8 三个级别,包括技能要求、薪资水平以及成长路线,为广大职场人士提供一份全面的攻略。

伤心的辣条 2万+

【并发编程】深入理解Java并发之synchronized实现原理

当方法调用时,调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。,它实现synchronized的锁对象的基础,这点我们重点分析它,一般而言,synchronized使用的锁对象是存储在Java对象头里的,jvm中采用2个字来存储对象头(如果对象是数组则会分配3个字,多出来的1个字记录的是数组长度),其主要结构是由。

m0_46638350的博客 1097

阿里不同职级薪资待遇一览表。。。

大家好,我是苍何。看到一份阿里不同职级薪资待遇表,觉得太过于真实,忍不住想和大家分享一波。阿里是互联网大厂的老江湖了,所谓的 BAT 中的 A 指的就是阿里巴巴,作为技术人员,这里更像是技术的乌托邦。阿里的职级更是业内的标杆,基本上招聘你可以看到什么对标阿里 P8,那就说明人家要招的这个岗位很牛逼,牛逼到得有很大的实力才能进去。那我们先来看看阿里的职级体系。

一个成长中的程序员,期待用技术的眼光生活 1万+

曝光一下阿里的工资待遇和职位级别

BAT 是互联网大厂的标杆,是很多程序员的梦想之地,这篇我来汇总一下阿里巴巴内部的职位级别和薪资待遇。阿里巴巴从两个维度来考察程序员的综合能力,分为技术级别和管理级别:技术级别从 P4 ~ P14,管理级别从 M1 到 M10。一般来说,刚入职阿里的应届生职级为 P5,工作 1~3 年之后可以晋升到 P6,通过社招进来的码农也从 P6 开始。到了 P7 级别,阿里才会给配置股票。目前阿里需求量最大的职级范围分布在 P6~P8,这也是阿里集团占比最大的级别。一般而言,在江湖上小有名气的阿里程序员至少也是 P8

AI大模型的博客 10万+

synchronized详解

synchronized详解

codedot 8万+

Java:Synchronized底层实现详解

本文深入剖析了Java中synchronized关键字的底层实现机制。从字节码层面看,同步代码块通过monitorenter和monitorexit指令实现,而同步方法则使用ACC_SYNCHRONIZED标志。核心在于Java对象头中的Mark Word,它根据锁状态(无锁、偏向锁、轻量级锁、重量级锁)动态变化,配合Monitor机制实现线程同步。文章还详细分析了synchronized的三种使用形式及其锁对象特性,揭示了JVM如何通过锁升级优化性能。理解这些底层机制对编写高效并发程序至关重要。

qq_49090426的博客 2468
上一篇: GitHub仅用6小时修复NPM JavaScript注册表
下一篇: 2021蚂蚁Java三面:二叉树+HTTPS加密+自旋锁+缓存穿透(附答案)
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值