synconized锁升级过程,偏向锁,轻量级锁,重量级锁

2024-06-12 08:04

本文主要是介绍synconized锁升级过程,偏向锁,轻量级锁,重量级锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

synconized锁的升级过程可以清晰地分为三个阶段:偏向锁、轻量级锁(自旋锁)和重量级锁。这个过程是为了优化锁的性能,减少不必要的同步开销。以下是详细的升级过程:

 

1. 偏向锁(Biased Locking)

目的:减少无竞争情况下的同步操作开销。

工作机制:

当一个线程首次访问同步代码块并获取对象的锁时,JVM会在对象的头部(Mark Word)中记录下该线程的ID,标记对象已偏向于该线程。

当该线程再次访问该同步代码块时,JVM会检查对象的头部信息,如果发现偏向的线程ID正是当前线程ID,则直接执行同步代码块,无需进行任何同步操作。

如果偏向的线程ID不是当前线程ID,或者对象未被偏向,则需要进行锁的撤销或升级。

2. 轻量级锁(Lightweight Locking)

目的:尽量避免线程切换的开销。

工作机制:

如果线程A尝试获取一个已经被线程B持有的偏向锁,JVM会尝试撤销偏向锁,升级为轻量级锁。

升级时,JVM会在当前线程的栈帧中创建一个Lock Record(锁记录),并将对象的Mark Word复制到Lock Record中。

然后,线程A会尝试使用CAS(Compare-and-Swap)操作将对象的Mark Word更新为指向Lock Record的指针。

如果CAS操作成功,则线程A获取到轻量级锁,继续执行同步代码块;如果CAS操作失败,则说明有其他线程(如线程B)正在持有该锁,此时线程A会进入自旋等待状态。

自旋等待过程中,线程A会不断尝试获取锁,直到成功或自旋次数达到上限。

3. 重量级锁(Heavyweight Locking)

目的:防止CPU空转,减少系统开销。

工作机制:

如果线程A在自旋等待过程中未能成功获取轻量级锁,或者等待时间超过阈值,JVM会将轻量级锁升级为重量级锁。

升级时,JVM会将未获取到锁的线程(如线程A)阻塞,使其进入等待队列(Wait Set)中等待。

同时,持有锁的线程(如线程B)在释放锁时,会唤醒等待队列中的线程进行竞争。

重量级锁通过操作系统的互斥量(Mutex)来实现,当线程尝试获取锁时,如果锁已被其他线程持有,则该线程会被阻塞,直到持有锁的线程释放锁。

总结

 

synchronized锁的升级过程是一个从偏向锁到轻量级锁再到重量级锁的渐进过程,旨在优化锁的性能和减少不必要的同步开销。在实际应用中,我们应该尽量避免出现重量级锁的情况,以减少线程切换和阻塞的开销。

这篇关于synconized锁升级过程,偏向锁,轻量级锁,重量级锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053647

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异