synchronized锁原理详解

Synchronized锁机制 文章目录2.1 Synchronized2.1.1 Synchronized 关键字回顾synchronized关键字的底层实现synchronized修饰代码块synchronized修饰普通方法synchronized修饰静态方法2.1.2 售票案例 2.1 Synchronized 2.1.1 Synchronized 关键字回顾 synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 阅读详情


前言(堆区对象组成部分)

在理解锁实现原理之前先了解一下Java的对象头和Monitor,在JVM中,对象是分成三部分存在的:

  • 对象头
  • 实例数据
  • 对其填充

实例数据和对其填充与synchronized无关,对象头是我们需要关注的重点,它是synchronized实现锁的基础,因为synchronized申请锁、上锁、释放锁都与对象头有关。


一、synchronized的使用

1.synchronize(this)

锁定实例化的对象,每个对象有其独立的对象锁,互不干扰

2.synchronize(Object o)

synchronize(Object o),每一个object相当于一把锁,不同的锁有不同的钥匙,可以减少锁竞争

3.synchronize放在函数签名里

synchronize放在函数签名中和synchronize(this)使用的是同一对象锁,一个钥匙多把锁


二、锁的不同状态

JDK6之前只有两个状态:无锁、有锁(重量级锁),

而在JDK6之后对synchronized进行了优化,新增了两种状态,总共就是四个状态:

  • 无锁状态
  • 偏向锁
  • 轻量级锁
  • 重量级锁

其中无锁就是一种状态了。锁的类型和状态在对象头Mark Word中都有记录,在申请锁、锁升级等过程中JVM都需要读取对象的Mark Word数据。

​ 每一个锁都对应一个monitor对象,在HotSpot虚拟机中它是由ObjectMonitor实现的(C++实现)。每个对象都存在着一个monitor与之关联,对象与其monitor之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个monitor被某个线程持有后,它便处于锁定状态。


三、synchronized 原理

Synchronized是关键字,内置语言实现
Synchronized底层使用指令码方式来控制锁的,映射成字节码指令就是增加来两个指令

monitorenter
monitorexit

当线程执行遇到monitorenter指令时会尝试获取内置锁,如果获取锁则锁计数器+1,如果没有获取锁则阻塞;当遇到monitorexit指令时锁计数器-1,如果计数器为0则释放锁。


四、锁升级机制

上面讲到的对象头8个字节,32位

上面介绍的四种状态,并且会因实际情况进行升级,过程如下

1.无锁

对象头前25位存hashCode,4位存分代年龄,1位判断是否是偏向锁(0),2位锁标志位(01)

2.偏向锁(只偏向一个)

对象头23位线程ID,2位时间戳(超时会判断线程存不存在,若不存在,变为无锁状态),4位分代年龄,(1)(01),这次拿到锁之后,下次直接拥有锁

一句话总结它的作用:减少统一鲜橙获取锁的代价。在大多数情况下,锁不存在多线程竞争,总是由同一鲜橙多次获得,那么此时就是偏向锁。

过程: 先说无锁—>偏向锁。锁的标志位都为01。
当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出同步块时不需要花费CAS操作来加锁和解锁,而只需简单的测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果测试成功,表示线程已经获得了锁,如果测试失败,则需要再测试下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁),如果没有设置,则使用CAS竞争锁,如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程。

​ 要注意的是,偏向锁使用了一种等到竞争出现才释放锁的机制,所以当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,然后检查持有偏向锁的线程是否活着,如果线程不处于活动状态,则将对象头设置成无锁状态,如果线程仍然活着,拥有偏向锁的栈会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。

3.轻量级锁(2个线程,竞争对手不多)

30位指向虚拟机栈执行代码的地址,(00)线程不会阻塞,一前一后去执行。自己去抢线程,如果始终得不到锁,自旋(50次)会消耗cpu

4.重量级锁(系统分配)

30位指向monitor地址,(10),系统分配由用户空间到了内核空间,一定会有一个人能分配到内存,竞争锁的线程会被阻塞。(多个线程排队—>objectMonitor—>wait()还想排队当notify()时再次排队,不想排队则结束)


五、Synchronized缺点

  • 无法判断锁状态,不知当前线程是否锁住 还是没有锁住
  • 不可中断,如果线程迟迟拿不到一把锁,这把锁被其他线程占用,会出现改线程一直等待
  • Synchronized非公平锁,任何新线程过来 与原先排队等待的线程 都有同样的机会获得锁
  • 关键字实现获取锁与释放锁,中间不可控
  • 当锁产生竞争时,两个和三个线程争取一把锁,没有获得到,此时改为系统主动分配,这也
  • 是重量级锁由来。此时会造成 用户空间切换到内核空间

六、Synchronized和Lock比较

  • Synchronized是关键字,内置语言实现,Lock是接口。
  • Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。
  • Lock是可以中断锁,Synchronized是非中断锁,必须等待线程执行完成释放锁。
  • Lock可以使用读锁提高多线程读效率。
synchronized原理详解(通俗易懂超级好) 目标 【理解】synchronized底层原理 【掌握】synchronized 的用法 目录目标一、synchronized原理1.1 原子性1.2 可见性1.3 有序性1.4 可重入性二、synchronized 的用法三、synchronized 的底层原理3.1 对象头在JVM中存储的形式3.1.1 对象头3.1.2 对象实例数据3.1.3 对齐填充3.2 Monitor3.3 synchronized锁的优化3.3.1 synchronized锁的状态3.3.2 偏向锁3.3.3. 轻量级锁3. 阅读详情

相关推荐

手把手教你用STM32CubeIDE移植Vector CCP驱动,实现与INCA的标定通信(附避坑指南)

本文详细介绍了如何在STM32CubeIDE环境下移植Vector CCP驱动,实现与INCA的标定通信。从开发环境准备、CAN外设配置到CCP协议栈移植和A2L文件生成,提供了完整的操作流程和常见问题解决方案,帮助工程师快速掌握基于CAN总线的标定技术。

weixin_28685287的博客 138

一篇就够,synchronized原理详解

synchronized详解 在多线程同时访问一个共享变量时,volatile是一个轻量级的解决方案,但是volatile只能修饰一个变量并且不保证原子性。在Java中还提供了两种方式实现同步互斥访问:synchronized和Lock 其实这些本质上就是加锁, 加锁目的:序列化访问临界资源,即同一时刻只能有一个线程访问临界资源(同步互斥访问) 不过有一点需要区别的是:当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变量是在每个线程的 私有栈中,因此不具有共享性,不会导致线程安全

小派师兄 1万+

实测避坑:用SGM61720做BUCK电路,SW引脚电压尖峰怎么压下去?

本文针对SGM61720在BUCK电路中SW引脚电压尖峰问题,提供实测避坑指南。通过分析电压尖峰、过冲等核心问题,详细讲解自举电阻调整、RC缓冲电路计算和PCB走线优化三大解决方案,帮助工程师有效降低SW引脚电压尖峰,提升系统稳定性和EMI性能。

weixin_42634811的博客 212

【多线程】synchronized 加锁原理详解

synchronized基本特点,synchronized加锁工作过程,偏向锁,轻量级锁,重量级锁, sunchronized优化操作,锁消除,锁粗化,相关面试题

ZXT的博客 2075

超越界面设计:GUI Guider与LVGL在STM32F103上的系统集成与架构思考

本文探讨了GUI Guider与LVGL在STM32F103微控制器上的系统集成与架构设计,重点分析了工程模块化组织、内存管理优化、硬件驱动接口设计以及FreeRTOS多任务集成。针对STM32F103ZET6的资源限制,提供了实用的移植策略和性能优化方案,帮助开发者构建高效、可维护的嵌入式GUI系统。

j2k3l4的博客 921

单相变换器的二次纹波分析

1. 单相PWM整流器的二次纹波产生原因   单相变换器的二次纹波产生的原因是功率含有二次脉动分量。设电网电压 us=Vmsin(wt),电网电流IL=Imsin(wt−θ)I_L=I_msin(wt-\theta)IL​=Im​sin(wt−θ)。其中w是电网电压披绿,θ\thetaθ是电流之后电压相位。保证输入功率和输出功率相等,就要保证两者的直流量和交流量对应相等。   uDu_DuD​为 PWM 整流器直流电容电压平均值,IoI_oIo​ 为负载电流平均值 ,uDC^\widehat {u_{DC}

qq_38847810的博客 4973

Synchronized加锁原理

Synchronized

tealala的博客 1357

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 148

JVM锁:synchronized原理详解

JVM锁:synchronized原理详解 本文整理本人对synchronized关键字的个人理解,增加自身对synchronized的理解与印象之外,也希望能对同样存在疑惑的你有所帮助。 文章目录JVM锁:synchronized原理详解前言一、对象在JVM的存储方式1.JVM运行时数据区2.对象内存中的布局二、锁状态的记录三、锁升级后记 前言 首先我们需要整理知道一些基本背景: 1.锁到底是什么? 就本人理解来说,锁是其实是程序多并发过程中为了保证线程安全原子性的一种方式,锁的本质其实是对资源操

hduzxl的专栏 1015

HFSS仿真PCB射频通路间的隔离度

本文介绍HFSS方式仿真带有器件的射频通路间的隔离度,可视为CST方式的补充,二者的结果相互参照。在前期靠仿真确认风险点时,可以作为一种较为直观和可信的手段。

sinat_15150363的博客 1524

基于TENG的呼吸测量与识别系统:从蓝牙到WiFi的改造与上位机实现

本文介绍了一种基于摩擦纳米发电机(TENG)的呼吸测量系统改造方案,将原有蓝牙通信升级为WiFi传输。系统通过TENG传感器采集呼吸信号,STM32微控制器处理数据后,经ESP8266 WiFi模块发送至上位机。文中详细阐述了硬件改造(四通道改单通道、蓝牙换WiFi)、嵌入式软件修改(包括ESP8266驱动、数据采集与TCP通信实现)以及上位机软件设计。改造后的系统提升了传输距离和稳定性,为可穿戴健康监测提供了更优解决方案。

huanghm88的专栏 110

Java 锁进化论:synchronized 的底层原理与锁优化技术详解

本文将深入剖析 synchronized 的底层原理、锁升级过程以及 JVM 对它的各种优化措施。

异常君的博客 843

配置适合Gurobi的机器硬件环境需要考虑的因素

介绍了在为gurobi选择合适的硬件环境时,需要考虑三个方面的因素;

Linshaodan520的博客 1063

详解Java Synchronized锁升级原理

理解synchronized的内部原理和锁的升级过程,对于编写高效的并发代码是非常有帮助的。希望本篇博客能帮助你理解和掌握这个重要概念。在并发编程的道路上,我期待你能走得更远,成就更大。

Hhzzy99的博客 877

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

synchronized 的实现原理以及锁升级详解

在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不那么重了。Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,在此了解一下锁的存储结构和升级过程。...

秃了也弱了 1154

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

synchronized 原理及锁升级机制详解

synchronized 原理及锁升级机制详解

weixin_42320587的博客 781

详解synchronized 和ReentrantLock两种锁实现原理

概述 Java 中的并发锁大致分为隐式锁和显式锁两种。隐式锁就是我们最常使用的 synchronized 关键字,显式锁主要包含两个接口:Lock 和 ReadWriteLock,主要实现类分别为ReentrantLock 和 ReentrantReadWriteLock,这两个类都是基于AQS(AbstractQueuedSynchronizer) 实现的。还有的地方将CAS也称为一种锁,...

ly199108171231的博客 4502

synchronized底层原理、偏向锁、轻量级锁、自旋锁详解

文章目录1.Java对象头2.Monitor工作原理3.synchronized原理4.synchronized原理进阶5.轻量级锁6.锁膨胀7.自旋优化8.偏向锁 1.Java对象头 对象头包含两部分:运行时元数据(Mark Word)和类型指针 (Klass Word) Mark Word Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。 类型指针 类型指针指向对象的类元数据

张大安的博客 2801

Java中Synchronized原理详解以及锁的升级

Java为了解决并发的原子性,提供了以下两个解决方案:1、Synchronized关键字 2、Lock 这篇文章我们先说一下Synchronized关键字,Lock等着下篇文章再说。 Synchronized是隐式锁,当编译的时候,会自动在同步代码的前后分别加入monitorenter和monitorexit语句。 1、Synchronized的三种用法 package juc; public...

qq_40276626的博客 100

java锁的相关术语及synchronized原理详解

java锁的相关术语及synchronized原理详解 1、几种锁的概念 (1)自旋锁 ​ CPU循环的使用CAS技术对数据尝试更新,直至成功。 (2)悲观锁 ​ 线程假定会发生并发冲突,同步所有对数据的操作,从读操作开始就上锁。 (3)乐观锁 ​ 线程假定没有冲突,在修改数据时发现数据和一开始获取的不一致,则读取最新数据并再次尝试修改。 (4)独享锁(写...

ww19940123的博客 314

【第三篇】Java中Synchronized原理详解以及锁的升级

【重要】Java中Synchronized原理详解以及锁的升级1.1 概述1.2 锁的分类1.3 引入synchronized1.4 Synchronized的使用1.4.1 修饰静态方法1.4.2 修饰非静态方法1.4.3 修饰代码块1.4.4 思考1.4.5 实现原理1.5 synchronized 锁的升级1.5.1 升级原理探索总结 1.1 概述   本次博客我们一起来讲解Synchronized的实现以及原理。 1.2 锁的分类 学习Java的过程中,会听到各种锁,比如显示锁、隐式锁、公平锁、非公

ᶻᶻᶻ 枕星河的博客 1589

synchronized 重量级锁的核心原理详解

在这里,我抛开一些细节术语,用更直接的方式来阐述 `synchronized` 的本质原理。实际上,`synchronized` 的原理并不复杂,很多时候是被各种包装概念和底层源码的畏惧感所阻碍。本文仅探讨重量级锁的原理,暂不涉及锁升级过程。

m0_51519887的博客 986

深入解析锁策略与synchronized原理与CAS原理详解

1、常见的锁策略:悲观锁 vs 乐观锁、重量级锁 vs 轻量级锁、挂起等待锁 vs 自旋锁、普通互斥锁 vs 读写锁、可重入锁 vs 不可重入锁、公平锁 vs 非公平锁。 2、synchronized的原理:JVM 将 synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况,进行一次升级。 3、CASL:全称为:compare and swap,也就是 "比较并交换",一个CAS涉及下述操作: 1)比较 A 和 V 是否相等。(比较) 2)如果比较相等,将 B 写入 V。(

2303_80388948的博客 1788

详解锁原理,volatile+cas、synchronized的底层实现

AQS其实就是基于volatile+cas实现的锁模板;如果需要线程阻塞等待,唤醒机制,则使用LockSupport挂起、唤醒线程//线程节点..........//head 等待队列头尾节点// The synchronization state. 同步状态...//提供CAS操作,状态具体的修改由子类实现AQS内部维护一个同步队列,元素就是包装了线程的Node同步队列中首节点是获取到锁的节点,它在释放锁的时会唤醒后继节点,后继节点获取到锁的时候,会把自己设为首节点。

m0_69632475的博客 828

Synchronized 关键字原理及锁升级过程详解

文章目录对象头MarkWord锁升级无锁偏向锁轻量级锁重量级锁参考资料 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但 是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。 从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter 和monitorexit指令实现的,而方法

秀强的专栏 505
上一篇: ReentrantLock的使用和原理详解
下一篇: RecyclerView使用和原理解析
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值