当前位置: 首页 > article >正文

面试官让我讲synchronized,老汪用一间厕所给我整明白了

“synchronized这我熟。项目里天天用。”面试官眼皮都没抬。“行。那你先说说synchronized锁的是什么东西”小强嘴角微微上扬。“锁的是对象。每个Java对象都可以作为锁。”“还有吗”“嗯……还能锁类比如synchronized加在静态方法上锁的就是Class对象。”“还有吗”小强愣了一下。“就……就这些吧”面试官把简历翻了一页。“那你讲讲一个线程拿到锁之后JVM内部是怎么记录这个状态的”小强开始有点磕巴。“呃……对象头里有个……mark word会存锁的状态。”“mark word里具体存了什么”“线程ID……还有……分代年龄……”“还有吗”“还有……”小强额头开始冒汗“好像跟偏向锁、轻量级锁有关具体怎么变的我不太确定。”面试官终于抬起头看了他一眼。“那你说说重量级锁底层是怎么实现的”小强感觉后背发凉。“ObjectMonitor……WaitSet……EntryList……”“这些数据结构之间是怎么协作的线程从阻塞到拿到锁经历了哪些状态流转”小强彻底蒙圈了。“这个……平时都是看网上文章没仔细研究过源码。”面试官把简历合上面无表情。“回去等通知吧。”小强从会议室出来感觉脚底下踩的是棉花。楼下长椅上老汪正在眯着眼睛晒太阳。“小强怎么了脸都绿了。”小强一屁股坐在老汪旁边竹筒倒豆子似的把刚才的问题复述了一遍。“老汪你说这面试官是不是故意刁难我synchronized不就是个锁吗会用不就行了”老汪慢悠悠地喝了口保温杯里的枸杞水。“他不是刁难你。他是想看你到底有没有搞懂并发编程的底层逻辑。”“这玩意儿说白了就是个排队上厕所的问题。”小强眼睛瞪大了。“厕所”老汪把保温杯放下比划起来。“你看synchronized锁的对象就好比厕所那扇门。门上的牌子就是mark word。”“没人上厕所的时候牌子显示‘空’。这就是无锁状态。”“一个人进去了牌子翻成‘有人’。这就是偏向锁。为啥叫偏向因为这个厕所现在偏向于刚才进去的那个人。他要是还想上第二次不用重新排队直接推门就进。”小强插嘴“那轻量级锁呢”“别急。这时候来了第二个人也想用这个厕所。他一看牌子占着呢。但他不死心就在门口转悠隔一会儿推一下门试试。这就是自旋。这时候mark word的状态就变成轻量级锁了。”老汪继续比划。“自旋的人多了门口转悠了十几个厕所还是没空。这时候管理员就该出来管事了。”“管理员就是操作系统。他会把门口转悠的人都轰走让他们去大厅等着。这就是重量级锁。大厅里的椅子就是EntryList。谁先来谁坐前面这叫公平排队。”小强若有所思“那WaitSet又是什么”“WaitSet是另一种情况。你上厕所上到一半发现没纸了。你就蹲那儿等着谁叫也不出去必须等有人给你送纸来。这时候你就是wait状态被挪到WaitSet里。送纸的人用完厕所出来喊一声notify你才能从WaitSet挪回EntryList重新排队。”“听懂了吗mark word的状态变化就是牌子上写的字从‘空’到‘有人’到‘请排队’。这个变化过程JVM帮你管了你不用操心。”小强挠挠头。“那我该怎么记清楚这些状态变化啊”老汪从兜里掏出手机翻出一张截图。“回去看HotSpot源码文件名叫synchronizer.cpp。重点看ObjectMonitor这个结构体里面的_owner、_EntryList、_WaitSet这些字段对应我刚才说的管理员、排队队伍、等纸队伍。”“再去看《Java并发编程的艺术》第三章讲锁的内存语义那部分。不是让你背是让你理解为什么要有这几种锁状态——一句话就是小气。能省则省实在不行再找管理员。”小强好奇地问“你刚才说小气是什么意思”老汪笑了笑。“这就是面试官问你这个题的真实意图。他根本不是考你会不会用synchronized。他是想看你对JVM的性能优化有没有概念。”“为什么要有偏向锁因为大部分时候一个锁根本没人抢。你让管理员每次来管太浪费了。JVM是出了名的小气鬼能自己搞定的绝不麻烦操作系统。”“轻量级锁就是小气到极致——哪怕有人在门口等只要等的时间不长也不叫管理员。自旋就是在那儿干等着赌你马上出来。”“实在不行等的人太多了操作系统介入才升级成重量级锁。这叫锁膨胀。”小强追问“那无锁和偏向锁之间呢还有什么批量重偏向、批量撤销”老汪满意地点点头。“这就问到点上了。JVM不光对单个锁小气对整个系统也小气。如果发现一个类的大部分对象都在频繁撤销偏向锁JVM会觉得‘这个类不配用偏向锁’直接给它禁掉。这就是批量撤销。”“你回去做个实验。用JOL工具打印对象头看锁状态变化。启动的时候加个JVM参数-XX:BiasedLockingStartupDelay0把偏向锁延迟关了。你会发现一个刚new出来的对象mark word最后三位是101这就是偏向锁的标记。”小强掏出手机记了下来。“老汪那你遇到过因为没搞懂这个原理导致的生产事故吗”老汪叹了口气。“多了去了。去年有个项目上线之后CPU直接飙到95%。”“查了半天发现有个接口几十个线程同时更新一个ConcurrentHashMap里的值。他们以为ConcurrentHashMap是线程安全的就没事了结果在值上面加了synchronized块。”“问题是这段代码的执行时间特别短可能就十几毫秒。这就导致大量线程都在自旋等锁。自旋是消耗CPU的。几十个线程一起自旋CPU能不飙吗”“解决办法很简单。要么把synchronized去掉用AtomicInteger的CAS操作。要么降低锁的粒度让线程不要扎堆。”小强倒吸一口凉气“这么细节的问题……”老汪站起来拍了拍小强的肩膀。“还有一次线上服务频繁Full GC。查出来有人在一个synchronized方法里对同一个对象反复调wait和notify。每次notify都会把等待线程从WaitSet挪到EntryList然后又要重新竞争锁产生大量短命对象。”“说到底就是你得明白你这个锁在JVM眼里到底干了啥。是偏向锁在那儿舒舒服服待着呢还是已经膨胀成重量级锁了操作系统在那儿忙活。”“面试官问你是不是只停留在表面就是看你有没有意识到这一个小小的synchronized背后是一整套锁升级策略、内存屏障、系统调用。”“回去先啃synchronizer.cpp的源码再看JOL工具的实验数据。搞懂了下次面试你就能反问他您是想听偏向锁撤销的阈值参数呢还是想听ObjectMonitor的底层AQS设计”小强站起来感觉刚才面试的阴霾一扫而空。虽然还是有点犯怵但至少知道路在哪了。“行老汪。我先回去看源码了。”走出两步他又回过头。“那个……synchronizer.cpp大概多少行”老汪眯着眼睛慢悠悠地拧开保温杯。“不多了。也就一万六千行。”小强腿一软差点跪在草坪上。

相关文章:

面试官让我讲synchronized,老汪用一间厕所给我整明白了

“synchronized?这我熟。项目里天天用。” 面试官眼皮都没抬。 “行。那你先说说,synchronized锁的是什么东西?” 小强嘴角微微上扬。 “锁的是对象。每个Java对象都可以作为锁。” “还有吗?” “嗯……还能锁类,比如…...

ARM开发平台SMC以太网与UART接口详解

1. ARM开发平台通信接口概述 在嵌入式系统开发中,通信接口的设计与实现是硬件与软件交互的关键。Juno r1 ARM开发平台作为一款功能强大的开发板,提供了多种通信接口方案,其中SMC以太网和UART接口是最常用的两种外设连接方式。 作为在嵌入式领…...

anaconda创建新环境激活

第一步,确认执行策略有没有改成功:Get-ExecutionPolicy -List重点看这一行:CurrentUser RemoteSigned如果看到 CurrentUser 对应的是 RemoteSigned,说明已经可以了。然后第二步,关闭当前 VSCode 终端,重…...

Intel Alder Lake混合架构移动处理器解析与应用指南

1. Intel Alder Lake混合架构移动处理器家族概览最近泄露的Intel Alder Lake移动处理器产品线规划显示,英特尔正在为不同功耗需求的移动设备打造一系列混合架构处理器。从仅5-7W功耗的平板电脑用处理器,到高达55W的移动工作站级别芯片,这个家…...

VS Code扩展图标消失?一键修复工具原理与使用指南

1. 项目概述:一个专治IDE“图标消失症”的修复工具如果你是一名重度使用AI编程助手的开发者,尤其是在VS Code、Cursor这类现代IDE里依赖OpenAI Codex扩展来提升编码效率,那么你很可能遇到过这个让人抓狂的“幽灵问题”:某天打开编…...

Python学习--tuple元祖

认识元组理解&#xff1a;不可以进行修改的“列表” 定义&#xff1a;tuple,() 注意&#xff1a;元组的元素可以是任意类型&#xff1b;元组元素不可修改t (1, 2, aaa, True, 3, [2, 3, 5, asd]) print(type(t)) #<class tuple> print(t) #((1, 2, aaa, True, 3, [2…...

Windows安卓应用安装终极指南:APK Installer让你告别模拟器时代

Windows安卓应用安装终极指南&#xff1a;APK Installer让你告别模拟器时代 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行手机应用却苦于找…...

Python模型微调效率提升300%:从数据预处理到梯度裁剪的5步工业级优化流程

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Python模型微调效率提升300%&#xff1a;从数据预处理到梯度裁剪的5步工业级优化流程 在真实生产环境中&#xff0c;微调大型语言模型常因I/O瓶颈、内存冗余和梯度震荡导致训练吞吐量低下。我们通过一套…...

Redis 高频八股文:从缓存到持久化,一篇搞懂常见面试题

前言Redis 是后端开发中非常常见的中间件&#xff0c;尤其是在 Java 项目里&#xff0c;经常用来做缓存、验证码、排行榜、分布式锁、限流等功能。面试的时候&#xff0c;Redis 也是高频考点&#xff0c;常见问题包括&#xff1a;Redis 为什么这么快&#xff1f;Redis 有哪些数…...

3步搞定跨平台应用:Windows系统上的轻量级安卓安装器全解析

3步搞定跨平台应用&#xff1a;Windows系统上的轻量级安卓安装器全解析 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想在Windows电脑上直接运行安卓应用&am…...

桌面机械爪DIY:从Arduino控制到Python编程的软硬件结合实践

1. 项目概述与核心价值 最近在折腾一个挺有意思的小玩意儿&#xff0c;叫“Clawd on Desk”。这名字听起来有点怪&#xff0c;但说白了&#xff0c;就是一个放在桌面上的微型机械爪。它的核心玩法&#xff0c;是通过一个叫“rullerzhou-afk”的开发者提供的开源项目&#xff0c…...

5分钟掌握Applera1n:iOS 15-16设备激活锁绕过终极指南

5分钟掌握Applera1n&#xff1a;iOS 15-16设备激活锁绕过终极指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n iOS激活锁是苹果设备的重要安全功能&#xff0c;但当你合法获得二手iPhone却无法联系…...

802.11a无线局域网技术解析与工程实践

1. 802.11a无线局域网技术概述2002年&#xff0c;当大多数企业还在使用11Mbps的802.11b无线网络时&#xff0c;IEEE推出的802.11a标准就像在乡间小道上突然出现的高速公路。作为第一代真正意义上的高速WLAN标准&#xff0c;它采用了当时革命性的5GHz频段和OFDM调制技术&#xf…...

别再死记硬背了!AutoSar CAN IF模块这10个配置项,新手工程师最常踩的坑都在这了

AutoSar CAN IF模块配置避坑指南&#xff1a;10个关键参数详解与实战经验 刚接触AutoSar BSW配置的工程师&#xff0c;面对CAN IF模块密密麻麻的参数表时&#xff0c;往往陷入两难&#xff1a;要么机械照搬参考项目配置&#xff0c;要么在参数间的复杂依赖关系中迷失方向。我曾…...

嵌入式系统平台选择与视频处理优化实战

1. 嵌入式系统平台选择的核心逻辑在嵌入式系统开发中&#xff0c;平台选择就像建造房屋前选择地基和建筑材料。这个决定不仅影响当前项目的成败&#xff0c;更会左右产品未来3-5年的生命周期。我经历过多次平台选型的痛苦抉择&#xff0c;最深刻的教训是&#xff1a;没有"…...

OpenClaw 如何快速接入 Taotoken 实现多模型调用

OpenClaw 如何快速接入 Taotoken 实现多模型调用 1. 准备工作 在开始配置之前&#xff0c;请确保您已经完成以下准备工作。首先&#xff0c;您需要在本地或服务器上安装好 OpenClaw 工具。其次&#xff0c;您需要拥有一个有效的 Taotoken API Key&#xff0c;可以在 Taotoken…...

Text2SQL智能查询系统 全局异常处理体系构建与代码精简优化

Text2SQL智能查询系统 全局异常处理体系构建与代码精简优化 在 Text2SQL 智能查询系统的开发迭代中&#xff0c;统一、规范的异常处理是提升系统健壮性、可维护性的核心环节。此前项目采用分散的 try-catch 处理异常&#xff0c;存在代码冗余、错误信息不统一、异常分类模糊等问…...

Gazebo UI太复杂?5个隐藏快捷键和自定义布局技巧,让你仿真效率翻倍

Gazebo UI太复杂&#xff1f;5个隐藏快捷键和自定义布局技巧&#xff0c;让你仿真效率翻倍 第一次打开Gazebo时&#xff0c;那个布满按钮和面板的界面确实让人望而生畏。左面板的世界树、插入选项&#xff0c;右面板的关节控制&#xff0c;顶部密密麻麻的工具栏——这简直像是飞…...

单源、多源最短路

一、单源最短路(无负权&#xff09;1.BFS&#xff08;无边权&#xff09;2.dijkstra(暴力&#xff09;#include<bits/stdc.h> #define ll long long using namespace std; ll dis[101290],n,m,s; bool vis[101001]; vector<pair<int,int>> g[10005]; void d(…...

星露谷物语终极生产力提升指南:5个必备SMAPI模组让你专注游戏乐趣

星露谷物语终极生产力提升指南&#xff1a;5个必备SMAPI模组让你专注游戏乐趣 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 还在为《星露谷物语》中繁琐的农场管理任务而烦恼吗&#x…...

具身智能(41):OpenVLA

一、OpenVLA 核心定位与本质 OpenVLA 是 开源社区主导 的轻量级 VLA 模型,核心定位是 “低成本、易部署的机器人操纵通用模型”—— 专为中小团队及科研场景设计,无需海量算力即可实现 “视觉 - 语言 - 动作” 的闭环控制。它与 π₀ 同属 VLA 范式,但更侧重 “实操数据驱动…...

3分钟搞定Axure RP中文界面:免费语言包终极指南

3分钟搞定Axure RP中文界面&#xff1a;免费语言包终极指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文…...

混杂接口配置练习

...

实战应用操作系统:基于快马生成代码实现一个简易Shell解释器

今天想和大家分享一个特别实用的操作系统学习项目——用C语言实现一个简易的Shell解释器。这个项目不仅能帮助我们理解操作系统底层的进程管理机制&#xff0c;还能通过实际编码掌握系统编程的核心技能。最近在InsCode(快马)平台上尝试了这个项目&#xff0c;发现它特别适合用来…...

基于Claude的智能体插件开发实战:从原理到企业级应用

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想给Claude这类大语言模型加上“手和脚”&#xff0c;让它能真正操作外部系统、调用API、处理文件。市面上工具不少&#xff0c;但要么太重&#xff0c;要么太散&#xff0c;直到我发现了yangtau/claude-agents-pl…...

Claude Code 如何配置 Taotoken 聚合端点实现稳定编程助手对接

Claude Code 如何配置 Taotoken 聚合端点实现稳定编程助手对接 1. 准备工作 在开始配置之前&#xff0c;请确保您已经拥有一个有效的 Taotoken API Key。您可以在 Taotoken 控制台的「API 密钥」页面创建新的密钥。同时&#xff0c;建议在「模型广场」中查看当前支持的 Claud…...

ARM调试状态原理与寄存器访问机制详解

1. ARM调试状态基础解析调试状态&#xff08;Debug State&#xff09;是ARM处理器为开发者提供的一种特殊运行模式&#xff0c;它允许处理器暂停正常指令流执行&#xff0c;转而进入调试环境。这种机制在嵌入式系统开发、芯片验证和故障排查中扮演着关键角色。当处理器进入调试…...

RubyLLM:统一AI接口,提升Ruby开发效率与多模型集成

1. RubyLLM&#xff1a;为Ruby开发者打造的优雅AI统一接口如果你是一名Ruby开发者&#xff0c;最近想在自己的Rails应用里加个聊天机器人&#xff0c;或者用AI分析用户上传的PDF合同&#xff0c;那你可能已经体验过那种“选择困难症”了。打开Gemfile&#xff0c;是选ruby-open…...

机器人导航与自动驾驶中的推理原语技术解析

1. 机器人导航中的推理原语技术解析在机器人导航领域&#xff0c;推理原语&#xff08;Reasoning Primitives&#xff09;是一组模块化的逻辑单元&#xff0c;它们将复杂的导航任务分解为可管理的子任务。这种技术最早可以追溯到上世纪90年代的基于行为的机器人控制理论&#x…...

DVB-H技术解析:移动数字电视的核心原理与应用

1. DVB-H技术概述&#xff1a;移动数字电视的革命DVB-H&#xff08;Digital Video Broadcasting - Handheld&#xff09;是欧洲DVB组织专为移动终端设计的数字电视广播标准。作为DVB-T&#xff08;地面数字电视广播&#xff09;的衍生技术&#xff0c;DVB-H通过多项创新解决了移…...