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

Java并发包中锁机制的底层实现原理剖析

实现java并发包中的锁机制底层主要有两种方式1.基于jvm的monitor机制和对象头中的marksynchronized关键字 word实现并通过锁升级(偏向锁→轻量级锁→重量级锁)优化性能2.java.util.concurrent.locks包中的锁基于abstractquedsynchronizeraqs通过volatile实现 state变量、cas操作和clh队列管理线程同步。在字节码层面synchronized依赖于monitorenter/monitorexit指令控制锁的获取和释放而aqs则通过子类重写tryacquire/tryrelease来定义同步语义并使用locksupport来阻塞和唤醒线程。此外并发包还包括atomic系列(基于cas实现无锁操作)、countdownlatch(基于aqs实现计数等待)、semaphore(基于aqs实现资源许可控制)、reentrantreadwritelock(基于aqs拆分state实现读写分离)和cyclicbarier(基于reentrantlock和condition实现循环屏障)等重要同步工具共同构成了java并发编程的核心支持系统。Java并发包中锁机制的底层实现原理剖析Java并发包中的锁机制其底层实现原理主要围绕两个核心点展开:一个是基于对象头和操作系统相互排斥JVM层面的synchronized关键词另一个是java.util.concurrent.在locks包中AbstractQuedsynchronizerAQS为基础构建的各种锁和同步器。了解它们的关键是掌握JVM对线程状态的管理调用操作系统的原始语言以及如何通过CASCompare-And-Swap操作以确保原子性和可见性。在我看来虽然这两种机制有不同的路径但它们都以不同的方式解决了并发场景下的资源竞争问题但synchronized更像是JVM的“黑盒魔法”而AQS提供了一种更灵活、更可控的“积木构建”方法。Java并发包中锁机制的底层实现原理剖析解决方案要深入分析Java并发包中锁机制的底层实现必须从两个主要分支入手:synchronized关键词和Java。.U.Cjava.util.concurrent包下的锁。synchronized关键词synchronized是Java语言层面的同步原语可作用于方法实例方法和静态方法或代码块。它的底层实现取决于JVM的Monitor管程机制。当一个线程试图获得synchronized锁时JVM将试图在对象的对象头上进行测试Object Header操作在中间。Mark在对象头中 Word字段是其核心它记录了对象的哈希码、GC信息和锁定状态。立即学习“Java免费学习笔记(深入)Java并发包中锁机制的底层实现原理剖析为了优化synchronized的性能JVM引入了锁升级Lock Escalation机制偏向锁Biased Locking 当一个线程首次访问同步块时如果对象没有被其他线程锁定JVM将对象的Mark Word设置为偏向模式并记录当前线程的ID。当后续线程再次进入同步块时只需检查Mark即可 无论Word中的线程ID是否为自己性能成本都非常低。轻量级锁Lightweight Locking 当第二个线程试图获得相同的synchronized锁时偏向锁将升级为轻量级锁。此时JVM将在当前线程的栈帧中创建一个Lock Record并将对象的Mark Word复制到其中。然后线程将尝试使用CAS操作来复制Mark。 Word指向Lock Record。如果CAS成功获得锁如果失败说明其他线程也在尝试获得轻量级锁会膨胀成重量级锁。重量级锁Heavyweight Locking 当多个线程竞争同一锁或轻量级锁CAS失败时锁将升级为重量级锁。此时JVM将调用操作系统底部的相互排斥Mutex实现线程的阻塞和唤醒。在锁被释放和唤醒之前阻塞的线程将被悬挂CPU资源将不再消耗。synchronized的锁升级机制旨在根据竞争程度动态调整锁的成本从低竞争时几乎没有成本到高竞争时的操作系统级同步。Java并发包中锁机制的底层实现原理剖析J.U.C包下的锁(基于AQS)java.util.concurrent.leeentrantlock等locks包提供了更灵活、更丰富的锁定机制、ReentrantReadWriteLock、Semaphore、CountDownlatch等。这些高级并发工具的基石是AbstractQuedsynchronizerAQS。AQS是一种抽象的队列同步器它提供了依赖先进先出的框架FIFO等待队列的阻塞锁和同步器。其核心思想包括整形state变量 用来表示同步状态。例如在Reentrantlock中state为0表示无锁大于0表示锁被持有其值表示重新进入次数state在semaphore中表示可用许可state在countdownlatch中表示计数器。一个CLHCraig, Landin, and HagerstenFIFO等待队列的风格 当线程同步状态失败时它将被包装成一个Node节点并添加到等待队列的尾部。基于CAS操作 所有通过CAS修改state变量和队列操作(如添加/删除节点)来保证原子性。LockSupport.park()LockSupport.unpark() AQS使用这两种方法来阻塞和唤醒等待队列中的线程而不是使用Object。.wait()和Object.notify()这使得线程的悬挂和唤醒更加准确避免了“假唤醒”等问题。通过实现tryAcquire()AQS的子类、tryRelease()等抽象方法定义具体的同步语义(独家模式或共享模式)而AQS本身负责管理队列、线程阻塞/唤醒的一般逻辑。如何实现Java中synchronized关键词的线程同步和锁升级Synchronized关键字在Java中实现线程同步其本质是通过JVM层面的Monitor(监视器)机制来完成的。每当创建一个对象时它在内存中都有一个对象头其中包含Mark Word和Klass Pointer等信息。Mark Word这个地方特别有趣。这是synchronized实现锁的关键。它将动态存储物体的哈希码、GC分代年龄以及最重要的锁标志位置和指向锁记录的指针或线程ID。当您用synchronized修改代码块或方法时JVM会在编译过程中生成两个字节码指令monitorenter和monitorexit。monitorenter指令试图获得锁如果成功将Mark 锁定标志位置设置为Word中的锁定状态。monitorexit指令是在同步块执行或抛出异常时释放锁。说到锁升级这真的是JVM为性能做的精致设计。它不是最重的锁而是根据实际竞争逐渐从轻到重升级:偏向锁Biased Locking 想象一下一个对象通常只被一个线程反复访问。在这种情况下每次去CAS或调用操作系统的原始语言成本太高了。因此JVM将“偏向”第一个获得锁的线程。当线程A第一次进入同步块时JVM将在对象头中使用Mark Word设置为偏向模式并记录下线程A的ID。之后只要线程A访问同步块它就可以直接进入而无需进行任何同步操作。这几乎是零成本的。但如果另一个线程B也试图获得锁偏向锁将被取消。取消过程需要等到整体安全点Safepoint然后暂停持有偏向锁的线程升级锁。轻量级锁Lightweight Locking 当偏向锁被取消或两条线程交替竞争但不是激烈竞争时锁将升级为轻量级锁。此时JVM不再直接调用操作系统而是使用CAS操作。每个线程将在自己的堆栈帧中创建一个Lock Record然后尝试使用CAS将对象的Mark Word指向这个Lockk Record。如果CAS成功说明锁定了。如果失败说明其他线程也在尝试CAS说明竞争激烈轻量级锁会进一步膨胀。重量级锁Heavyweight Locking 当轻量级锁的CAS操作失败或多线程持续激烈竞争时锁将膨胀为重量级锁。此时Mark Word将指向真实操作系统级的互斥量Mutex。那些没有抓到锁的线程会被堵塞park进入等待队列不再消耗CPU资源。当锁的线程释放锁时它会被唤醒unpark等待队列中的一个或多个线程重新竞争。这种锁升级的过程是一个动态适应的过程使得synchronized在不同的并发场景中表现出更好的性能。但值得一提的是一旦升级到重量级锁就无法降级通常是因为重量级锁成本高线程上下文切换成本高。AbstractQueuedSynchronizer (AQS) 在J.U.C包扮演了什么核心角色在我看来AbstractQueuedSynchronizerAQS并在Java发包J.U.C简直就是“基石”它定义了大多数高级并发工具的骨架和灵魂。可以说没有AQSJ.U.今天的C包不会有强大和灵活性。AQS本身不是一个锁而是一个用于构建锁和同步器的抽象框架。它包装了所有复杂的同步逻辑如排队、阻塞、唤醒和同步状态管理。开发人员只需要注意具体的同步语义即如何获取和释放资源而不用担心底部的线程调度细节。AQS的核心构成包括volatile int state变量 这是AQS的灵魂它代表同步状态。这种状态的具体含义完全由AQS的子类定义。例如Reentrantlock用它来表示锁的重新进入次数Semaphore用它来表示可用的许可数量Countdownlatch用它来表示需要等待的事件数量。volatile关键字保证了state变量在多线程之间的可见性。FIFO等待队列 这是一个双向链表用于存储未能获得同步状态并被阻塞的线程。每个线程都被包装成一个Node节点不仅包括线程本身还包括线程状态如是否需要唤醒、是否共享模式等。当一个线程试图获得同步状态失败时它将被包装成一个Node并添加到队列的尾部然后挂起。基于CAS的操作 通过CAS对State变量的所有修改以及等待队列的添加和删除操作Compare-And-Swap保证原子性的原语。这避免了传统重量级锁的使用从而提高了并发效率。LockSupport.park()LockSupport.unpark() AQS使用这两个底层工具来准确地阻止和唤醒等待队列中的线程。与Object相比.wait()和Object.notify()park/unpark更灵活不需要先获取对象的监控锁可以操作特定的线程避免死锁和虚假唤醒等问题。

相关文章:

Java并发包中锁机制的底层实现原理剖析

实现java并发包中的锁机制底层主要有两种方式:1.基于jvm的monitor机制和对象头中的mark,synchronized关键字 word实现并通过锁升级(偏向锁→轻量级锁→重量级锁)优化性能;2.java.util.concurrent.locks包中的锁基于abstractquedsynchronizer&…...

熟悉C#如何转TypeScript——SDK与包引用的主要区别

SDK与包引用的主要区别 在 TypeScript 开发中,包引用(import/require)并不是 SDK 的集合,而是模块化代码库的引用方式。以下是详细解释:核心概念对比特性TypeScript/JavaScript (npm).NET Core SDK包管理工具npm / yar…...

OpCore Simplify革新:4步实现OpenCore EFI配置的极简实践

OpCore Simplify革新:4步实现OpenCore EFI配置的极简实践 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾在普通PC上安装macOS时&…...

虚幻引擎+数字孪生:手把手搭建智慧校园三维可视化平台(附浙江工商大学实战案例)

虚幻引擎数字孪生:从零构建智慧校园三维可视化平台的完整指南 想象一下,清晨走进校园时,管理员已经在三维可视化平台上完成了安防巡查;教务主任通过热力图调整着今天的课程安排;后勤人员正根据实时数据优化能源分配——…...

STM32G473 IAP实战:基于CAN/USART双通道的BootLoader设计与固件升级全流程解析

1. 为什么需要双通道IAP方案 在工业现场设备维护中,固件升级是个高频刚需。想象一下车间里有上百台设备需要更新程序,如果每台都要拆机接下载器,工程师怕是会当场崩溃。我去年参与的一个AGV调度项目就吃过这个亏,后来我们给STM32…...

STM32F103红外循迹避障小车实战:从Proteus仿真到实物调试全解析

1. STM32F103与红外循迹避障小车入门指南 第一次接触STM32F103做红外循迹避障小车时,我和很多初学者一样,以为照着网上的例程就能轻松搞定。但真正动手后发现,从仿真到实物调试的每个环节都可能遇到意想不到的问题。这个小车看似简单&#xf…...

SEO_详解SEO优化的基本原理与核心策略介绍

<h2>SEO优化的基本原理&#xff1a;为什么SEO对网站流量至关重要</h2> <p>SEO优化&#xff0c;即搜索引擎优化&#xff0c;是指通过优化网站结构、内容和外部链接等多个方面&#xff0c;提高网站在搜索引擎结果页面上的排名&#xff0c;从而吸引更多自然流量…...

【限时技术白皮书】:Istio 1.20正式版Java适配黄金72小时——我们已验证的6大兼容性断点及热修复方案

第一章&#xff1a;Istio 1.20正式版Java微服务适配全景概览Istio 1.20 正式版于2023年10月发布&#xff0c;针对Java生态的可观测性、安全通信与流量治理能力进行了系统性增强。该版本在Sidecar注入、Java应用兼容性、OpenTelemetry集成及JVM指标采集方面均实现关键演进&#…...

SD-WebUI Cleaner 终极指南:AI图像清理与对象移除完整教程

SD-WebUI Cleaner 终极指南&#xff1a;AI图像清理与对象移除完整教程 【免费下载链接】sd-webui-cleaner An extension for stable-diffusion-webui to remove any object. 项目地址: https://gitcode.com/gh_mirrors/sd/sd-webui-cleaner 你是否曾经想要从照片中移除不…...

罗技鼠标宏压枪脚本终极指南:3步实现绝地求生精准射击

罗技鼠标宏压枪脚本终极指南&#xff1a;3步实现绝地求生精准射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中枪口乱跳而烦…...

BEYOND REALITY Z-Image实测:同一张脸,两种质感,细节对比一目了然

BEYOND REALITY Z-Image实测&#xff1a;同一张脸&#xff0c;两种质感&#xff0c;细节对比一目了然 今天我要带大家做一个有趣的实验。想象一下&#xff0c;你面前站着同一个人&#xff0c;但左边是手机快照&#xff0c;右边是专业单反拍摄的照片——这就是BEYOND REALITY Z…...

OpenClaw局域网访问配置

根据OpenClaw最新官方文档&#xff08;截至2026年3月&#xff09;&#xff0c;以下是更新后的局域网访问配置指南&#xff0c;整合了网络架构、安全加固和自动化配对等新特性&#xff1a;一、核心配置命令&#xff08;基于新版网关协议&#xff09;启用LAN多接口监听 使用新参数…...

GEE实战:MODIS NDVI数据高效获取与自动化处理全流程

1. 从零开始认识MODIS NDVI数据 第一次接触遥感数据分析的朋友可能会被各种专业术语搞得晕头转向。别担心&#xff0c;我们先来聊聊这个"MODIS NDVI"到底是什么。简单来说&#xff0c;NDVI&#xff08;归一化差值植被指数&#xff09;就像是给地球做体检的"体温…...

3分钟快速上手:免费Windows字体自定义工具No!! MeiryoUI终极指南

3分钟快速上手&#xff1a;免费Windows字体自定义工具No!! MeiryoUI终极指南 【免费下载链接】noMeiryoUI No!! MeiryoUI is Windows system font setting tool on Windows 8.1/10/11. 项目地址: https://gitcode.com/gh_mirrors/no/noMeiryoUI 还在为Windows系统单调的…...

CRNN OCR文字识别镜像:开箱即用,轻松集成到你的项目中

CRNN OCR文字识别镜像&#xff1a;开箱即用&#xff0c;轻松集成到你的项目中 1. 项目概述 在现代数字化场景中&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为从图像中提取文本信息的关键工具。本镜像基于工业级CRNN&#xff08;卷积循环神经网络&#xff0…...

RMBG-2.0异常处理指南:解决常见部署与运行问题

RMBG-2.0异常处理指南&#xff1a;解决常见部署与运行问题 抠图工具用得好好的&#xff0c;突然给你来个报错&#xff0c;或者生成的结果莫名其妙&#xff0c;是不是特别让人头疼&#xff1f;尤其是像RMBG-2.0这样效果出色的工具&#xff0c;一旦出问题&#xff0c;很多人就不…...

207_深度学习调优:透彻理解权重衰退(L2 正则化)

在模型训练中&#xff0c;如果特征过多而数据较少&#xff0c;模型很容易为了拟合每一个样本而产生巨大的权重值&#xff0c;导致过拟合。权重衰退的核心思想就是&#xff1a;通过在损失函数中添加惩罚项&#xff0c;让模型偏好更小的权重。1. 为什么“小权重”能防止过拟合&am…...

206_深度学习进阶:模型选择、过拟合与欠拟合的生存法则

在机器学习中&#xff0c;我们的目标是发现泛化&#xff08;Generalization&#xff09;模式&#xff0c;即在未见过的数据上也能预测准确。然而&#xff0c;模型往往会陷入两个极端&#xff1a;要么学得太浅&#xff08;欠拟合&#xff09;&#xff0c;要么记住了噪音&#xf…...

TresJS实战指南:Vue 3D场景开发从入门到精通

1. TresJS基础入门&#xff1a;从零搭建3D场景 第一次接触TresJS时&#xff0c;我完全被它的简洁性震惊了。作为一个基于Three.js的Vue组件库&#xff0c;它让3D开发变得像写普通Vue组件一样自然。先来看个最简单的例子&#xff1a; <template><TresCanvas><Tre…...

Qwen2.5-72B-GPTQ-Int4开源镜像:Chainlit前端定制化开发入门指南

Qwen2.5-72B-GPTQ-Int4开源镜像&#xff1a;Chainlit前端定制化开发入门指南 想快速搭建一个功能强大、界面美观的AI对话应用吗&#xff1f;今天&#xff0c;我们就来聊聊如何基于Qwen2.5-72B-GPTQ-Int4这个顶级开源大模型&#xff0c;以及Chainlit这个轻量级前端框架&#xf…...

从单调到惊艳:手把手教你用PyQt5 QPalette打造动态渐变和图片自适应背景窗口

从单调到惊艳&#xff1a;手把手教你用PyQt5 QPalette打造动态渐变和图片自适应背景窗口 在桌面应用开发中&#xff0c;用户界面的视觉体验往往决定了产品的第一印象。传统的单色背景或简单图片填充已经难以满足现代用户对美感的追求。PyQt5作为Python生态中最强大的GUI框架之一…...

Stable Yogi Leather-Dress-Collection 皮革设计效果惊艳展示:多风格高清作品集

Stable Yogi Leather-Dress-Collection 皮革设计效果惊艳展示&#xff1a;多风格高清作品集 最近在AI设计圈里&#xff0c;有个模型挺火的&#xff0c;叫Stable Yogi Leather-Dress-Collection。光听名字你可能就猜到了&#xff0c;它专门用来生成皮革连衣裙的设计图。我花了一…...

XC7Z100与GMSL FMC采集卡在自动驾驶视觉系统中的高效集成方案

1. XC7Z100与GMSL FMC采集卡的核心价值 在自动驾驶视觉系统中&#xff0c;图像采集的实时性和可靠性直接决定了系统的性能上限。XC7Z100 FPGA与GMSL FMC采集卡的组合&#xff0c;就像给系统装上了"超清眼睛"和"高速神经"。我曾参与过一个夜间自动驾驶项目&…...

别再让用户长按了!用html2canvas在微信H5里优雅生成分享海报(Vue3/TS实战)

微信H5海报生成实战&#xff1a;用html2canvas打造零摩擦分享体验 每次看到用户笨拙地长按屏幕、小心翼翼地调整手指位置就为了保存一张活动海报&#xff0c;作为开发者的你是否感到一丝愧疚&#xff1f;在移动端体验至上的今天&#xff0c;这种原始操作显然与"优雅"…...

遥感数据处理避坑指南:实测光谱如何用Matlab匹配卫星波段(以GF-6为例)

遥感数据处理避坑指南&#xff1a;实测光谱如何用Matlab匹配卫星波段&#xff08;以GF-6为例&#xff09; 当你在野外辛苦采集的ASD高光谱数据与卫星影像比对时&#xff0c;是否遇到过这样的困惑&#xff1a;明明地面测量值看起来合理&#xff0c;但和卫星数据对比时却总存在难…...

【开题答辩全过程】以 基于Android的收支记账管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

Vue 3.4 defineModel实战:5分钟教你封装一个带.trim和.number的智能输入框

Vue 3.4 defineModel实战&#xff1a;5分钟封装智能输入框组件 在表单交互开发中&#xff0c;输入框处理用户数据时经常需要基础格式处理——比如自动去除首尾空格、将字符串转为数字。传统方案需要在每个使用处手动调用.trim()或parseFloat()&#xff0c;既重复又容易遗漏。Vu…...

Vivado里SRIO IP核Basic模式配置详解:从链路宽度到Buffer深度,新手避坑指南

Vivado中SRIO IP核Basic模式配置全解析&#xff1a;从参数理解到实战避坑 第一次在Vivado中配置SRIO IP核时&#xff0c;面对密密麻麻的参数选项&#xff0c;大多数工程师都会感到无从下手。作为Xilinx FPGA中实现高速串行通信的关键IP&#xff0c;SRIO&#xff08;Serial Rap…...

从原始数据到三维点云:TI毫米波雷达信号处理全链路拆解

1. 毫米波雷达基础与TI设备特性 毫米波雷达作为现代感知技术的核心组件&#xff0c;其工作原理类似于蝙蝠的生物声呐系统&#xff0c;只不过使用的是电磁波而非声波。TI&#xff08;德州仪器&#xff09;的AWR系列雷达设备因其高性价比和完整开发生态&#xff0c;成为工业界的热…...

基于MPC的双馈风机暂态过电压抑制策略研究

基于MPC的双馈风机暂态过电压抑制策略研究 摘要 弱电网条件下,双馈风机(DFIG)在电网故障清除瞬间易发生暂态过电压。传统矢量控制(VC)中,无功电流外环PI控制器存在响应滞后,导致无功功率回撤速度无法匹配系统电压的突变。本文提出一种基于模型预测控制(MPC)的转子侧…...