synchronized锁机制升级过程——面试题

news2024/11/26 16:55:52

1. 无锁状态

  • 对象在没有被任何线程锁定时处于无锁状态。此时对象头中的锁标志位通常表示为无锁(例如,标记字段的特定位组合表示无锁或偏向锁状态)。

2. 偏向锁(Biased Locking)

  • 初次获取:当线程首次获得对象锁时,如果对象处于无锁状态,系统会将其升级为偏向锁。此时会在对象头的 MarkWord 中记录当前线程的 ID,表明该锁偏向于这个线程。后续该线程再次请求该锁时,只需验证 MarkWord 中的线程 ID 是否与当前线程 ID 相符,相符则无需进一步同步操作即可直接获取锁。
  • 撤销与偏向撤销:当有第二个线程尝试获取该偏向锁时,偏向锁将被撤销,恢复到无锁状态。随后,锁会根据竞争情况升级为轻量级锁或重量级锁。此外,为了应对程序运行过程中线程生命周期较短、偏向锁失效的情况,JVM 还会定期或在特定条件下进行全局偏向锁撤销操作。

3. 轻量级锁(Lightweight Locking)

  • 获取:当线程 A 在偏向锁撤销后尝试获取锁时,如果发现锁已被偏向线程 B 持有,线程 A 将尝试使用 CAS(Compare-and-Swap)操作将对象头的 MarkWord 替换为指向线程 A 线程栈中锁记录(Lock Record)的指针,并将锁记录中的指针回写到 MarkWord。如果 CAS 成功,线程 A 获得锁,否则说明有其他线程(可能是线程 B 或其他新竞争者)也在尝试获取锁,此时进入下一步。
  • 自旋与升级:若 CAS 失败,线程 A 会进入自旋状态,循环尝试获取锁。如果在一定次数(默认通常是10次)的自旋后仍未能获得锁,轻量级锁将升级为重量级锁。升级过程包括:线程 A 首先暂停自旋,然后在对象头中设置标志,触发锁膨胀,将锁变为重量级锁。同时,线程 A 会被挂起,加入到锁对象对应的 Monitor(重量级锁)的等待队列中。

4. 重量级锁(Heavyweight Locking)

  • 获取:一旦锁升级为重量级锁,所有后续尝试获取锁的线程都会被阻塞,放入操作系统层面的等待队列中,由操作系统进行线程调度和上下文切换。
  • 释放:持有锁的线程执行完同步代码块后,释放锁。操作系统会唤醒等待队列中的一个(或多个,取决于锁策略)线程,使其重新尝试获取锁。

无锁、偏向锁、轻量锁属于用户态(jvm),重量锁属于内核态(系统)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC--核心概念 / @RequestMapping注解

目录 1. 准备工作 1.1. 创建SpringMVC-demo02 子模块 1.2. 添加相关依赖 1.3. 设置 Maven 打包方式 1.4. 配置 web.xml 文件 1.4.1. 创建 web.xml 文件 1.4.2. 默认配置方式 1.4.3. 扩展配置方式 1.4.4. 注意点 1.5. 配置 Spring 文件 1.5.1. Thymeleaf视图解析器 …

知识图谱的最新进展与未来趋势

知识图谱的最新进展与未来趋势 一、引言 在过去的几年中,知识图谱已经从一个前沿的研究概念发展成为现代信息技术不可或缺的一部分。作为结构化知识的存储和表示形式,知识图谱通过组织信息和数据提供了深刻的洞见,它已被广泛应用于搜索引擎优…

HarmonyOS4-学习入门知识总结

简单的组件学习: /*** weip 自定义控件* 自定义构建函数也是需要充电的地方,分全局和局部的* 全局:需要添加function关键字 局部:不加function关键字* Styles function 自定义公共样式 分全局和局部* Extends(Text) 继承模式 只…

springboot 创建子模块时 pom 配置

创建子模块 2. 修改父模块 pom 文件 添加如下内容 <packaging>pom</packaging><modules><module>mybatisconf</module></modules>3. 修改子模块 pom 文件 <parent><groupId>com.vazquez</groupId><artifactId>bo…

wangEditor 测试环境对,但是生产环境无法显示

package.json 文件版本 "wangeditor": "4.3.0"开发环境 new Editor(#${this.id});出来的数据 正式环境 new Editor(#${this.id});出来的数据 原因&#xff1a; vue.config 文件 打包策略的时候 const assetsCDN {css: [https://lf6-cdn-tos.bytecd…

python中报错“ModuleNotFoundError: No module named ‘openpyxl‘”

python中报错“ModuleNotFoundError: No module named ‘openpyxl’” 问题描述 运行python代码时&#xff0c;报错“ModuleNotFoundError: No module named ‘openpyxl’” 解决方案&#xff1a; 可能是没有安装openpyxl&#xff0c; # 安装命令 pip install openpyxl #…

如何恢复未保存或删除/丢失的Word文件?

关闭 Word 应用程序而不保存文档&#xff1f;误删Word文档&#xff1f;许多用户会在不同的情况下丢失Word文档。如果不幸遇到此类问题&#xff0c;如何恢复已删除或未保存的 Word 文档&#xff1f;有一些方法可以恢复未保存/删除的文档。此外&#xff0c;您还可以使用Word文件恢…

【USB 】Jack (Female) Type A Connectors 2 Port Mounting Peg

1. NO BACK SHIELD&#xff0c;NO ARMS&#xff0c;FRONT GROUNDING ARMS 2. BACK SHIELD&#xff0c;NO FRONT GROUNDING ARMS 3. NO BACK SHIELD&#xff0c;FRONT GROUNDING ARMS 4. BACK SHIELD&#xff0c;FRONT GROUNDING ARMS

金铲铲单机版含教程,仅支持S1\S6\S11赛季

金铲铲单机版&#xff0c;官方的单机版&#xff0c;支持S3/S6/S11赛季&#xff0c; 我自己玩了两把&#xff0c;可以加金币/加血/设置GM权限等&#xff0c; 我猜测是开发者测试版本&#xff0c; 金铲铲单机版含教程&#xff0c;仅支持S1\S6\S11赛季 网盘自动获取 链接&#xff…

基于springboot+vue实现新闻推荐系统项目【项目源码+论文说明】

基于springboot实现新闻推荐系统演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算…

MySQL 优化总结

目标知识 MySQL执行流程图 MySQL 优化成本路线图 优化成本&#xff1a;硬件>系统配置>数据库表结构>SQL及索引。优化效果&#xff1a;硬件<系统配置<数据库表结构<SQL及索引。 MySQL 五大优化原则 减少数据返回&#xff1a;设置合理字段数据类型、启用压缩…

深入理解LRU缓存算法:原理、应用与优化

LRU算法&#xff08;Least Recently Used&#xff0c;最近最少使用算法&#xff09;的思想是基于"时间局部性"原理&#xff0c;即在一段时间内&#xff0c;被访问过的数据在未来仍然会被频繁访问的概率较高。 LRU 原理 LRU算法的主要思想是将最近被使用的数据保留在…

【小程序】常用方法、知识点汇总1

欢迎来到《小5讲堂》 这是《小程序》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言请求超时Markdown解析逐行显示效果文本变动事件转发…

Vue-Router入门

现在的前后端分离项目&#xff0c;后端只管数据传递&#xff0c;视图跳转的活交由前端来干了&#xff0c;vue-router就是专门来干这个活的&#xff0c;它可以让页面跳转到指定组件 组件是可复用的 Vue 实例, 把一些公共的模块抽取出来&#xff0c;然后写成单独的的工具组件或者…

Live800:理解、调节与管理客户情绪,提升客户满意度

在企业与客户的交互过程中&#xff0c;客户情绪的管理是至关重要的。一个成功的企业不仅要提供优质的产品或服务&#xff0c;还需要关注和理解客户的情绪&#xff0c;有效地调节和管理客户的情绪&#xff0c;以提升客户满意度。文章从三个方面进行深入探讨&#xff1a;理解客户…

Netty的基本架构与组件

Netty实战精髓 前言 Netty的组成部分 1、Channel 2、Callback 3、Future ChannelFuture 提供多个附件方法来允许一个或者多个 ChannelFutureListener 实例&#xff0c;这个回调方法 operationComplete() 会在操作完成时调用。 4、Event和Handler 5、EventLOOP Netty 通过触发…

Mysql底层原理十:Redo log

3.7 Redo log Redo log记录的是物理日志&#xff0c;具体就是哪个表空间&#xff0c;哪个数据页&#xff0c;哪个偏移量&#xff0c;改了几个字节&#xff0c;改成什么表空间号数据页号偏移量修改几个字节的值具体的值 3.7.1 Redo block &#xff08;批处理缓存&#xff09;…

基于SSM+Jsp+Mysql的物流管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

程序员必须要知道的一个在线专业书网站

网站&#xff1a; https://awesome-programming-books.github.io/ https://git-scm.com/book/zh/v2 截图如下&#xff0c;可以看到&#xff0c;里面有很多数&#xff0c;可以在线看&#xff0c;免得去到处找了。