Java面试八股之Synchronized锁升级的原理

  1. Synchronized锁升级的原理

Synchronized锁升级是Java为了提高并发性能而引入的一项优化措施,这一机制主要发生在JDK 1.6及之后的版本中。Synchronized锁升级旨在减少锁带来的性能开销,通过从低开销的锁逐步升级到高开销的锁,以适应不同的竞争场景。其基本原理涉及四个阶段:无锁、偏向锁、轻量级锁和重量级锁。

无锁状态:初始时,对象头中并没有任何锁的信息,对象处于无锁状态。

偏向锁(Biased Locking):

目标是消除数据竞争较少情况下的同步开销。当第一个线程访问同步块并获取锁时,JVM会将其标记为偏向锁,并将锁标记为这个线程ID。

在随后的访问中,如果仍然是这个线程请求锁,只需检查对象头中的线程ID即可,无需执行加锁操作,这大大提升了性能。

偏向锁可以被撤销,如果其他线程尝试获取这个锁,偏向锁会升级到轻量级锁。

轻量级锁:

当有第二个线程尝试竞争偏向锁时,偏向锁升级为轻量级锁,此时会尝试使用CAS操作(Compare and Swap)来避免线程阻塞。

竞争线程会尝试将自己线程的锁记录(存放在栈帧中)与对象头中的Mark Word交换,如果成功,则获取到锁,失败则自旋等待。

自旋是指线程在原地循环等待锁的释放,而不是立即挂起,减少了线程上下文切换的开销。

若自旋达到一定次数仍未获取到锁,轻量级锁会升级到重量级锁。

重量级锁:

当多个线程持续竞争,自旋不会带来收益时,锁升级为重量级锁,此时会使用操作系统的互斥量(mutex)来实现线程阻塞与唤醒。

这一阶段会涉及线程状态的转换和操作系统级别的上下文切换,开销较大,但能有效处理高度竞争的场景。

锁升级的过程是不可逆的,一旦升级到重量级锁,就不会再降级回轻量级锁或偏向锁。理解锁升级机制的关键在于认识到它是根据竞争情况动态调整的,以最小化同步操作的性能影响。在回答时,可以强调这一机制如何根据实际的竞争程度逐渐增加锁的复杂度,以平衡性能与安全需求。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/650965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swagger测试接口,请求头添加token

概述Swagger 1、概述 在日常开发中,我们的业务需要用户登录,权限控制。但是在某些情况下我们使用Swagger测试接口,部分接口需要携带token,才能访问,就需要在swagger添加token窗口。 效果图: 由 右上角 A…

统计计算四|蒙特卡罗方法(Monte Carlo Method)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法(Expectation-Maximization Algorithm,期望最大化算法) 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念(一)估算 π \pi π(二&…

现代 c++ 三:移动语义与右值引用

移动语义很简单,但它相关联的术语很复杂。本文尝试从历史的角度解释清楚这些乱七八糟的术语及其关联: 表达式 (expression)、类型(type)、值类别 (value categories); 左值 (lvalue)、右值 (rvalue)、广义左值 (glval…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

UML-系统架构师(二)

1、UML(Unified Modeling Language)是面向对象设计的建设工具,独立于任何具体程序设计语言,以下()不属于UML中的模型。 A用例图 B协作图 C活动图 DPAD图 解析: UML一共14种图 结构图&…

【传知代码】私人订制词云图-论文复现

文章目录 概述原理介绍核心逻辑1、选取需要解析的txt文档2、选取背景图明确形状3、配置停用词4、创建分词词典,主要解决新的网络热词、专有名词等不识别问题 技巧1、中文乱码问题,使用的时候指定使用的文字字体2、更换背景图3、词库下载以及格式转换方式…

vscode在Ubantu键位错乱问题

摘要:抄的vscode键位错乱_有没有在使用vscode时偶尔遇到退格键无法正常删除内容的情况?如果有的话,你是如何-CSDN博客 只是作为记录,查找方便

ThreadLocal一步梭哈

大家好,这里是教授.F 引入: 1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. 2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法[源码!] 3. ThreadLocal 可以像 Map 一样存取数据…

vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示

vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示 一、前言1.代码案例2.效果展示 一、前言 当使用 Vue 3 和 Element UI 的 el-table 组件时,你可以通过判断字段的值来设置对应的 el-button 的 disabled 属性和消息提示。下面是一个简单的示例…

机器学习之朴素贝叶斯

目录 前言 1、核心思想 2、应用领域 一、数学基础 二、贝叶斯 三、朴素贝叶斯 1、定义 2、拉普拉斯平滑系数 四、API 1、API 2、案例 五、总结 前言 朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理和特征条件独立性假设的常见的机器学习分类算…

Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】

Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】 0 问题描述&解决 问题描述: 通过go编写了一个程序,产生的/var/log/xx日志文件发现普通用户无权限打开 - 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限 - 查看该日…

如何免费把微信视频号的视频下载下来?电脑手机都可使用

今天,我将为大家分享一个实用的技巧:如何免费将微信视频号的视频下载下来。 微信视频号作为一个流行的短视频平台,拥有大量优质内容。然而,由于平台政策限制,我们无法直接下载视频。不过,别担心&#xff0…

单点登录(JWT实现)

单点登陆的英文名是:Single Sign On(简称SSO),只需要登陆一次,就可以访问所有信任的应用系统。 在单体项目中,我们登陆之后可以把验证用户信息的值放入session中,单个tomcat中的session是可以共…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客:https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…

堆结构知识点复习——玩转堆结构

前言:堆算是一种相对简单的数据结构, 本篇文章将详细的讲解堆中的知识点, 包括那些我们第一次学习堆的时候容易忽略的内容, 本篇文章会作为重点详细提到。 本篇内容适合已经学完C语言数组和函数部分的友友们观看。 目录 什么是堆 建堆算法…

蓝桥杯2023(十四届)省赛——接龙数列(DP)

接龙数列(DP) 1.接龙数列 - 蓝桥云课 (lanqiao.cn) 琢磨半天,本来是开一个三维的,dp[i][j][k] 表示 前i个,以j为首项,k为尾项的最大子集个数,但是实际上用二维即可。想求的是删除个数&#xf…

java并发工具类都有哪些

Java中的并发工具类包括: CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成某些操作。它通常用于线程间的同步,例如在一个线程完成其工作后通知其他线程继续执行。 CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一…

STM32H743+USBHID+CubeMX配置

一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Keil v5.35、STM32CubeMX v6.5.0 测试硬件:正点原子阿波罗STM32H743 二、测试步骤 1、使用用例工程 配置STM32H743定时器功能-CSDN博客https://blog.csdn.net/horse_2007s/article/d…

基于51单片机的电压表-数码管显示

一.硬件方案 本设计基于STC89C52单片机的一种电压测量电路,该电路采用ADC0832A/D转换芯片,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单, 可以测量0~9V的电压值,并在四位LED数码管上显示电压值。 二.设计功能 (1&…

HNCTF

HNCTF 文章目录 HNCTFBabyPQEZmathez_Classicf(?*?)MatrixRSABabyAESIs this Iso? BabyPQ nc签到题,跟端口连接拿到n和phin n 8336450100232098099043686671148282601664696810002345240872579498695511770993195704402414029892029461830476866385453475141207…