ReentrantLock加锁与解锁源码解析

嵌入式SDIO 总线面试题及参考答案 SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。 阅读详情

ReentrantLock公平锁与非公平锁的lock()和unlock()过程解析. 源码比较简单, 静下心来就可以看懂, 本文旨在记录加锁与解锁的过程.

ReentrantLock.lock()

public void lock() {
        this.sync.lock();
    }

sync.lock()取决于ReentrantLock获取锁的机制: 公平性FairSync or 非公平性NonfairSync(Default)

ReentrantLock自定义同步器Sync

FairSync, NonfairSync

abstract static class Sync extends AbstractQueuedSynchronizer

static final class FairSync extends ReentrantLock.Sync

static final class NonfairSync extends ReentrantLock.Sync

这里写图片描述

非公平性(实现重进入的过程)

1. ReentrantLock默认是NonfairSync

public class ReentrantLock implements Lock, Serializable {
    private final ReentrantLock.Sync sync;  // 自定义同步器

    public ReentrantLock() {
        // 默认是NonfairSync
        this.sync = new ReentrantLock.NonfairSync();
    }

2.NonfairSync获取锁调用过程:

ReentrantLock.lock() –> this.sync.lock();(即 NonfairSync.lock()) –> AbstractQueueSynchronizer.acquire() –> NonfairSync.tryAcquire(int var)

// NonfairSync.NonfairSync
final void lock() {
            if(this.compareAndSetState(0, 1)) {
            // 当前无线程占用同步锁
                this.setExclusiveOwnerThread(Thread.currentThread());
            } else {
                this.acquire(1);
            }

        }
// AbstractQueueSynchronizer.acquire()
public final void acquire(int var1) {
        if(!this.tryAcquire(var1) && this.acquireQueued(this.addWaiter(AbstractQueuedSynchronizer.Node.EXCLUSIVE), var1)) {
            selfInterrupt();
        }

    }

image

// // NonfairSync.NonfairSync
protected final boolean tryAcquire(int var1) {
        return this.nonfairTryAcquire(var1);
    }

ReentrantLock自定义同步器Sync.nonfairTryAcquire(int var)
该方法增加了再次获取同步状态的处理逻辑

final boolean nonfairTryAcquire(int var1) {
            Thread var2 = Thread.currentThread();
            int var3 = this.getState();
            if(var3 == 0) {  // 首次获取同步锁
                if(this.compareAndSetState(0, var1)) {
                    this.setExclusiveOwnerThread(var2);
                    return true;
                }
            } else if(var2 == this.getExclusiveOwnerThread()) {  
            // 当前线程为获取锁的线程, 增加同步状态值
                int var4 = var3 + var1;
                if(var4 < 0) {
                    throw new Error("Maximum lock count exceeded");
                }

                this.setState(var4);
                return true;
            }
            // 不是以上两种情况,则等待获取同步锁
            return false;
        }

3. ReentrantLock释放锁调用全过程:

ReentrantLock.unlock() –> this.sync.release(1); (即 AbstractQueueSynchronizer.released()) –> ReentrantLock.Sync.tryRelease()

// ReentrantLock
public void unlock() {
        this.sync.release(1);
    }
// AbstractQueueSynchronizer
public final boolean release(int var1) {
        if(this.tryRelease(var1)) {
            AbstractQueuedSynchronizer.Node var2 = this.head;
            if(var2 != null && var2.waitStatus != 0) {
                this.unparkSuccessor(var2);  // 唤醒头节点的后继节点
            }

            return true;
        } else {
            return false;
        }
    }

ReentrantLock自定义同步器Sync.tryRelease(int var)
倘若该锁被获取了n次

protected final boolean tryRelease(int var1) {
            int var2 = this.getState() - var1;
            if(Thread.currentThread() != this.getExclusiveOwnerThread()) {
                throw new IllegalMonitorStateException();
            } else {
                // 前n-1次返回为false
                boolean var3 = false;
                if(var2 == 0) {
                // 只有该线程的同步状态完全释放,才返回false,占有线程为null。
                    var3 = true;
                    this.setExclusiveOwnerThread((Thread)null);
                }

                this.setState(var2);
                return var3;
            }
        }

公平性 (FIFO)

1. ReentrantLock构造函数

public ReentrantLock(boolean var1) {
// True为公平锁, False为非公平锁
        this.sync = (ReentrantLock.Sync)(var1?new ReentrantLock.FairSync():new ReentrantLock.NonfairSync());
    }

2. FairSync获取锁全过程

ReentrantLock.lock() –> this.sync.lock();(即 FairSync.lock()) –> AbstractQueueSynchronizer.acquire() –> FairSync.tryAcquire(int var)

// ReentrantLock.FairSync
final void lock() {
            this.acquire(1);
        }
// AbstractQueueSynchronizer
public final void acquire(int var1) {
        if(!this.tryAcquire(var1) && this.acquireQueued(this.addWaiter(AbstractQueuedSynchronizer.Node.EXCLUSIVE), var1)) {
            selfInterrupt();
        }

    }
// ReentrantLock.FairSync
protected final boolean tryAcquire(int var1) {
            Thread var2 = Thread.currentThread();
            int var3 = this.getState();
            if(var3 == 0) {
                if(!this.hasQueuedPredecessors() && this.compareAndSetState(0, var1)) {
                    this.setExclusiveOwnerThread(var2);
                    return true;
                }
            } else if(var2 == this.getExclusiveOwnerThread()) {
                int var4 = var3 + var1;
                if(var4 < 0) {
                    throw new Error("Maximum lock count exceeded");
                }

                this.setState(var4);
                return true;
            }

            return false;
        }

与ReentrantLock.UnfairSync.nonfairTryAcquire()相比较, 判断条件多了!this.hasQueuedPredecessors()(同步队列中当前节点是否有前驱节点, true为有线程比当前线程更早地请求获取锁, ==需要等待前驱线程获取并释放锁之后才能继续获取锁==)

3. FairSync释放锁的过程同NonfairSync

BMP390L数字大气压传感器原理图设计,已量产(压力传感器) 在工业设备的室内定位、地下设施监测这类 GPS 信号盲区场景里,气压高度检测的 “靠谱程度” 直接决定了系统的可用性 —— 毕竟谁也不想在地下停车场导航时,设备把 1 楼误判成 3 楼。最近在项目里基于博世 BMP390L 做了硬件电路设计,正好聊聊这款工业级数字气压传感器的硬实力,以及原理图里的那些关键设计细节。 阅读详情

相关推荐

Windows应急响应实战:灰鸽子木马检测与清除全流程解析

远程控制木马(RAT)是一种基于客户端/服务器(C/S)架构的恶意软件,攻击者通过它能够远程操控受害主机,实现屏幕监控、文件窃取、键盘记录等操作,对个人隐私与企业数据安全构成严重威胁。其技术原理通常涉及进程注入、网络通信、持久化机制等核心环节,在应急响应中具有极高的分析价值。掌握此类木马的检测与清除方法,是Windows系统安全防护与事件处置的基本功。本文以经典的灰鸽子木马为例,结合进程分析、网络排查、注册表检查等实战技术,系统讲解从行为识别、痕迹取证到彻底清除的完整操作流程,并涵盖Rootkit对抗、无文

weixin_30521161的博客 413

ReentrantLock 源码解析

ReentrantLock 实现了 Lock 接口,内部基于 AQS 实现。所以想要弄懂 ReentrantLock ,一定要先弄明白AQS。ReentrantLock 是可重入锁,同一个线程能够多次获取到同一个 ReentrantLock 锁。ReentrantLock 类采用的是 AQS 技术中的独占模式,实现了 AQS 的 3 个关键方法:tryAcquire(),tryRelease(),isHeldExclusively()方法。

weixin_45278293的博客 1541

SPSS_Process—简单&平行&链式中介模型

本篇文章介绍采用SPSS的插件Process对简单中介、链式中介、平行中介模型进行检验的操作方法及结果解读。

m0_54401011的博客 4万+

ReentrantLock源码解析

解析了ReentrantLock类的部分重点源码。

weixin_48288539的博客 968

Skyworks SKY85331-11的Wi-Fi 6 (802.11ax)标准 2.4G 高功率WLAN前端模块解决方案

SKY85331-11是高度集成的2 GHz前端模块(FEM)包含2 GHz单刀双掷(SPDT)发送/接收(T / R)开关,2 GHz低噪声放大器(LNA)带旁路和一个2 GHz功率放大器(PA),用于大功率802.11ax应用程序和系统LNA和PA禁用功能可确保低漏电流 关闭模式。 包括一个集成的功率检测器以提供系统内的闭环功率控制。该设备提供Small (24-pin, 3 x 5 mm) (LGA)封装。 图1.引脚配置和封装如图所示 图2.信号引脚分配和功能引脚描述 图...

zhangbao19890622的博客 4503

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

并发编程笔记一-ReentrantLock源码深度解析

通过画图深度的解析ReentrantLock的加锁和释放锁的流程,并对其源码进行结构化的拆解和分析,帮助小伙伴们更快更深层次的理解什么是ReentrantLock。

qq_41191331的博客 1266

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

本文记录了使用xCoreSDK-Python驱动Rokae实体机械臂的测试流程。

机器人梦想家 Bing Lee 1498

ReentrantLock的超详细源码解析

ReentrantLock是基于AQS框架的一个子类,实现了可重入锁,其中有公平与非公平两种类型,是一个非常重要的工具,也是学习鬼斧神工一般的AQS的很好的出发点注:本文适合想要深究AQS的队列的实现和原理,ReentrantLock的机制的人参考,文章较长其实还是比较好理解的,只要理解了基本框架,接下来的超时锁,可打断锁,条件队列这些就不足为惧了本质上就是把普通的可重入锁加了个超时结束,遇到打断直接抛出异常。

qq_30004513的博客 1422

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

【2025国赛C题】高教社杯全国大学生数学建模竞赛C题思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2901

总结一下:电源设计 ≠ 画个电路图就完了

如果你面对一块电源板时,只知道输入输出是多少伏,那你离真正懂它还差十万八千里。你要懂拓扑、理解工作原理、看懂波形、会分析环路、熟练选型,还得懂调试、EMC和热设计——才能自信地说:“我会搞电源了。电源不是一个人能独挑的“电”,而是控制、模拟、热、EMC 多学科交融的“多面体”。这也是为什么它既复杂又迷人✨。

weixin_43199439的博客 143

多线程JUC 第2季 ReentranctLock实现加锁和解锁过程

1.ReentrantLock 意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。ReentrantLock内部实现依赖于AQS。

健康平安的活着的专栏 294

PHPStorm携手ThinkPHP8:开启高效开发之旅

本文围绕使用 PHPStorm 进行 ThinkPHP8 开发展开,先介绍开发环境搭建与 Xdebug 配置,再阐述 PHPStorm 集成 ThinkPHP8 的步骤,包括项目导入、解释器和服务器配置。还讲解了项目开发基础、数据库操作、高级技巧、调试处理及部署上线等内容,为开发者提供了从环境搭建到项目上线的完整指引,助力高效开展 ThinkPHP8 开发工作。

邓邓子的博客 1544

【AQS源码解析】ReentrantLock的公平锁加锁解锁分析

引言 ​ AQS是用来构建锁和其他同步组件的基础框架,它也是Java三大并发工具类(CountDownLatch、CyclicBarrier、Semaphore)的基础。ReentrantLock,甚至BlockingQueue也是基于它的实现。本文从ReentrantLock的lock()出发,从源码维度分析一个加锁解锁动作都干了什么事。 ​ 公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 ​ 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,

a1850568889的博客 679

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

并发编程-ReentrantLock加锁解锁源码详细解析

这里写自定义目录标题AQS**加锁源码**新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 AQS 当我们构造一个ReentrantLock对象的时候,可以通过传入一个布尔值来指定公平锁还是非公平锁,进入源码可以发现区别是n

weixin_39827884的博客 837

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ReentrantLock 源码解析(二)—— 加锁解锁方法概览

ReentrantLock 加锁解锁的基本方法逻辑

every__day的博客 457

在ReentrantLock的角度解析AQS源码

目录AQSstateCASReentrantLock加锁源码解析ReentrantLock解锁源码解析总结 这两天空下来研究了一下AQS,跟大家分享一下我对AQS的理解,我们从一个问题入手来解决这个问题,ReentrantLock如何加锁,如何解锁 ,第一次写文章,排版和表达都不是很规整,请各位小伙伴能够帮我指出文章中的问题,后面咱们可以深入交流。 AQS AbstractOwnableSynchronizer 就是jdk底层定义的一个模板方法,大多数的同步组件都是根据这个抽象类实现的 state /**

渐宽的博客 198

ReentrantLock源码浅析

文章目录一、前言二、源码介绍1、基本构造2、加锁与解锁2.1、加锁2.1.1、公平锁2.1.2、非公平锁2.2、解锁三、小结 一、前言   在此前《ReentrantLock基本介绍》这篇博客中已经介绍了ReentrantLock的基本使用,那在本篇博客中将会简要介绍下其内部的主要源码。 前提:对AbstractQueuedSynchronizer(简称AQS)有了解,不清楚的可以先去看看《AbstractQueuedSynchronizer源码——基本认识》 二、源码介绍 1、基本构造   在上面两

风清云淡 199

万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)

男生魅力最重要的部分,是有勇气面对失败;而生活的美好之处,恰恰在于它的不确定性 前言 AbstractQueuedSynchronizer(AQS)是 Java 并发编程中绕不过去的一道坎,JUC 并发包下的 Lock、Semaphore、ReentrantLock 等都是基于 AQS 实现的。AQS 是一个抽象的同步框架,提供了原子性管理同步状态,基于阻塞队列模型实现阻塞和唤醒等待线程的功能 文章从 ReentrantLock 加锁、解锁应用 API 入手,逐步讲解 AQS 对应源码以及相关隐含流..

Long-Tai 8741

Java ReentrantLock可重入锁的源码深度解析

Java的ReentrantLock的源码实现,包括加锁、解锁的源码,以及公平性、重入性的实现!

终生学习践行者 3639

ReentrantLock的源码阅读

ReentrantLock的源码阅读

cssweb_sh的博客 215

JMM——AQS之ReentrantLock源码解读

文章目录ReentrantLock源码解读1.什么是ReentrantLock?2.ReentrantLock的用法3.源码解读(公平锁为例)3.1 从构造方法入手3.2 加锁逻辑入手 reentrantLock.lock();3.2.1 查看tryAcquire方法。3.2.2 查看addWaiter方法。3.2.3 查看acquireQueued方法。3.3 释放锁逻辑入手 reentrantLock.unlock();3.3.1 tryRelease(),尝试释放锁。3.3.2 unparkSucce

zl13101758272的博客 260

深入理解 JUC 的 ReentrantLock 加锁和解锁流程

下面这张图 你需要明白的是先讲解一下大概的流程ReentrantLock 首先lock-》 公平锁或者非公平锁的 lock()-》acquire(1) 就会跑到AQS的代码中。

sjisbbeksudh的博客 523

ReentrantLock源码解读

目录`ReentrantLock` 概述可重入性 ReentrantLock 概述 ReentrantLock 来自于 jdk 1.5,位于 JUC 包的 locks 子包,独占(互斥)式可重入锁。Synchronized 的功能他都有,并且具有更加强大的功能 实现了 Lock 接口,具有通用的操作锁的方法。内部是使用 AQS 队列同步器来辅助实现的,重写了 AQS 的获取独占式锁的方法,并实现了可重入性 ReentrantLock 还具有公平与非公平两个获取锁模式,这个并非 AQS 提供的,而是Ree

桐花思雨 311

JUC并发编程AQS源码解读

JUC个人学习笔记

西岭千秋雪的博客 1208

reentrantlock原理_面试难点:深度解析ReentrantLock的实现原理

什么是ReentrantJdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。Synchronized和ReentrantLock的相同点:1.Ree...

weixin_39807352的博客 118

Java锁源码分析(一):AQS & ReentrantLock

AQS的源码学习欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markd

404Coder 495
上一篇: 首次将本地代码上传至github
下一篇: ReentrantReadWriteLock 读写锁获取与释放源码解析
猪杂汤饭
博客等级 码龄12年 238粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值