ReentrantLock源码解析

工业缺陷检测深度学习方法综述 异常:点异常、 上下文异常和集群异常。点异常:又称为离群值 (outliers)[9], 描述数值上偏离正 常样本的独立数据。与异常相近的概念还包括新颖点(novelty)和分布外数据。上下文异常:同样描述数据点,其数值属于正常范围,但不符合局部上下文规律。集群异常:描述一系列相关数据的集合,集合中的每一个实例的数值在单独考察时都处于正常值域,但集 合整体的相关性特征不服从正常模式。一般的图像异常检测往往仅需区分正常与异常样本,而工业缺陷检测更关注于检测 图像中的异常像素. 阅读详情

ReentrantLock源码解析

简介

ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized,是一种互斥锁,可以保证线程安全。
相对于 synchronized, ReentrantLock具备如下特点:

  • 可中断
  • 可以设置超时时间
  • 可以设置为公平锁(默认非公平)
  • 支持多个条件变量
  • 与 synchronized 一样,都支持可重入

ReentrantLock最重要的是三个内部类Sync、NonfairSync和FairSync。

1、Sync

1.1、 nonfairTryAcquire(int acquires)
非公平锁尝试获取锁。逻辑简单,在AQS中已经讲过了。

final boolean nonfairTryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        if (compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        // int最高位为正负标记位
        if (nextc < 0) 
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

1.2、释放锁 tryRelease(int releases)
只有释放锁完成后满足 c == 0 才返回true,因为重入锁获取了几次就要释放几次。

protected final boolean tryRelease(int releases) {
    int c = getState() - releases;
    if (Thread.currentThread() != getExclusiveOwnerThread())
        throw new IllegalMonitorStateException();
    boolean free = false;
    if (c == 0) {
        free = true;
        setExclusiveOwnerThread(null);
    }
    setState(c);
    return free;
}

1.3、abstract void lock()
抽象方法,用于子类继承,在公平锁和非公平锁种会分别做具体的实现。

2、NonfairSync extends Sync

非公平锁主要重写两个方法 lock() 和 tryAcquire(int acquires)

2.1 lock()

因为是非公平锁,所以获取锁的时候不排队,先尝试获取锁,获取失败则调用AQS的 acquire() 方法。

final void lock() {
    if (compareAndSetState(0, 1))
        setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

2.2 tryAcquire(int acquires)

在AQS中说过,子类必须自己写具体的获取锁的逻辑即重写 tryAcquire(int acquires) 方法。
而在非公平锁种, tryAcquire(int acquires) 其实是调用的父类 Sync 的 nonfairTryAcquire(acquires) ,同样是先直接尝试获取锁。

protected final boolean tryAcquire(int acquires) {
    return nonfairTryAcquire(acquires);
}

2.3 NonfairSync 小结

ReentrantLock的非公平锁在调用Lock() 方法时,会先进行两次CAS尝试获取锁,获取失败后才进入同步队列排队。

3、FairSync extends Sync

3.1 lock()

公平锁的lock()直接调用AQS的 acquire(1) 方法,而不是像非公平锁一样先尝试获取锁。

final void lock() {
    acquire(1);
}

3.2 tryAcquire(int acquires)

在公平锁中,tryAcquire(int acquires) 方法和非公平锁的区别是,不再可以直接CAS尝试获取锁,而是通过AQS 的排队校验方法 hasQueuedPredecessors() 来判断是否需要排队,如果不需要才能尝试获取锁,体现其公平性。

protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        if (!hasQueuedPredecessors() &&
            compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

3.3 FairSync 小结

ReentrantLock的公平锁在调用Lock() 方法时,判断当前线程是否需要排队来决定是否能够尝试获取锁,相比于非公平锁的两次直接CAS,这样做保证了其公平性(其实公平锁也不是完全公平)。

23 中望CAD二次开发(ZRX C++)-自定义实体(二) 本文详细介绍了自定义图形实体,如何实现几何变换、捕捉、节点编辑,并介绍了CAD代理的概念。 阅读详情

相关推荐

如何更好的理解PFC(功率因数校正)

此电路虽然简单,可以在前期设计的无PFC功能的设备上,简单的增加一个合适的电感(适当的选取L和C的值),从而达到具有PFC的作用,但是这种简单的、低成本的无源PFC输出纹波较大,滤波电容两端的直流电压也较低,电流畸变的校正及功率因数补偿的能力都很差,而且L的绕制及铁芯的质量控制不好,会对图像及伴音产生严重的干扰,只能是对于前期无PFC设备使之能进入市场的临时措施。)在t4~t5期间尽管二极管左边电压在逐步上升,但是由于二极管右边的Uc放电缓慢右边的电压Uc仍旧大于左边,二极管仍旧反偏截止。

U_YAO的博客 949

ReentrantLock的超详细源码解析

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

qq_30004513的博客 1424

Dify实战应用指南(上传需求稿生成测试用例)

摘要: Dify是一款开源大语言模型应用开发平台,通过低代码/无代码方式支持AI应用开发。平台提供五种核心应用类型,包括聊天助手、文本生成、Agent、ChatFlow和Workflow,适用于不同场景。本文以ChatFlow为例,演示如何上传需求稿自动生成测试用例。通过条件分支、文档提取器和LLM设置,实现从需求文档到测试用例的自动化转换,显著提升测试效率并降低人工误差。该方案适用于需要快速生成测试用例的软件开发场景,尤其适合非技术人员使用。

Linda的自动化测试之旅 2745

ReentrantLock 源码解析

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

weixin_45278293的博客 1541

R爬虫RSelenium环境搭建及简单应用

这是鄙人自己实践的一种可行的环境搭建,我会尽量详细的写下大家步骤。

weixin_44349986的博客 2015

Windows BITS服务:后台智能文件传输技术详解

后台文件传输技术是现代IT基础设施中的关键组件,Windows BITS(Background Intelligent Transfer Service)作为微软原生解决方案,通过队列管理和智能调度实现高效数据传输。其核心技术原理包括分块传输、断点续传和带宽自适应,能够根据网络状况动态调整传输速率(默认占用空闲带宽的80%)。在工程实践中,BITS特别适用于企业软件分发和自动化数据采集场景,通过PowerShell命令即可实现高优先级传输和代理配置。相比传统FTP方案,BITS在跨国文件传输中将失败率从30

weixin_42116058的博客 281

05.ReentrantLock源码解析

ReentrantLock源码解析 ReentrantLock类图 加锁成功流程分析 1.构造器分析 public ReentrantLock() { //默认为非公平锁NonfairSync继承自Sync又继承自AQS。 sync = new NonfairSync(); } 2.lock()方法 final void lock() { //使用CAS去修改state如果修改成功则说明获取到了锁则然后设置独占状态下这把锁的主人是当前线程。 if (compareAnd

weixin_43891622的博客 233

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf

泛红尘的博客 2998

ReentrantLock 深入源码解析

  ReentrantLock是JUC提供的可重入锁,与synchronized提供相似的功能,但是ReentrantLock和synchronized之间还是存在一些异同:   · synchronized是独占锁,加解锁过程自动进行,易用但不灵活。ReentrantLock是JUC提供的独占锁,加解锁过程手动进行,不易用但灵活。   · ReentrantLock和synchronized均是重入锁,synchronized由于是语言级提供,不必担心加解锁的过程。ReentrantLock由于是JUC提

键盘上流淌的日子 7630

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4899

ADRC自抗扰PD+ESO控制(博途SCL源代码)

文章浏览阅读119次。线性自抗扰控制(LADRC)系统算法框图-优快云博客文章浏览阅读335次。NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。ADRC自抗扰PD+ESO控制(CODESYS测试+完整ST代码)-优快云博客。

RXXW_Dor的博客 1317

从源码解析ReentrantLock的lock以及unlock

ReentrantLock()源码解析 只是写出了自己的理解,希望日后有个可以回忆的地方。 1.创建ReentrantLock()对象。不传参数默认是非公平锁,传true则是公平锁。传入false也是非公平锁。 2.lock方法,当第一个线程进来的时候走compareAndSetState(),CAS,如果state是0,就设置当前线程拥有独占访问权。 否则进入acquire方法。 3. acquire方法里面调用了三个方法,依次介绍。 4.tryAcquire()方法,JUC采用的模版模式,直接戳

li416338592的博客 359

【系统分析师】2009年真题:综合知识-答案及详解

在某银行业务的用例模型中,“取款”用例需要等到“存款”用例执行之后才能执行,两个用例之间的关系属于(1);“取款”和“存款”两个用例中都需 要执行查询余额的功能,将查询余额提取成独立的用例,那么“取款”和“存款” 用例与“查询余额”用例之间的关系属于(2)。(1)A. 关联关系 B. 扩展关系 C. 使用关系 D. 依赖关系 (2)A. 扩展关系 B. 使用关系 C. 依赖关系 D. 继承关系【参考答案】D、A雇员类含有计算报酬的行为,利用面向对象的(3),可以使得其派生类专职 雇员类和兼职雇员类计算报酬的

数据知道的博客 1万+

ReentrantLock源码+图深度解析呀

彻底理解ReentrantLock简介源码解析   java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。 简介   ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。 synchronized是独占锁,加锁和解锁的过程自动

可能是个最差的程序员了 280

IEM模型,地表粗糙度模拟

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ReentrantLock加锁与解锁源码解析

ReentrantLock公平锁与非公平锁的lock()和unlock()过程解析.ReentrantLock.lock() public void lock() { this.sync.lock(); }sync.lock()取决于ReentrantLock获取锁的机制: 公平性FairSync or 非公平性UnfairSync(Default)非公平性(实现重进入的过程

programmer_at的专栏 745

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

AQS之ReentrantLock源码解析

ReentrantLock源码解析 AQS的基本概念 Java并发编程核心在于java.concurrent.util包,juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQS,AQS定义了一套多线程访问共享资源的同步器框架,是一个依赖状态(state)的同步器。 AQS保证线程安全的大致原理(伪代码) //加锁 lock; //为什么要..

Me_xuan的博客 317

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 并发编程之ReentrantLock源码解析

  上一篇中,我们在源码的角度讲了AbstractQueuedSynchronizer的原理,链接为 Java 并发编程之AbstractQueuedSynchronizer源码解析 ,这一篇中,我们从源码的角度讲一下 ReentrantLock 的原理。   我们知道,ReentrantLock是我们在jdk中经常使用的可重入锁的实现类,内部分为公平的可重入锁以及不公平的可重入锁,那么这些机制...

HappyHeng的博客 764

ReentrantLock和AQS 源码解析

概要 ReentrantLock是一种经常会被用来与Synchronized比较的一种同步机制,其在Java中的应用也十分广泛,比如最常见的BlockingQueue就是使用了ReentrantLock来实现的同步机制。 个人认为ReentrantLock和Synchronized的区别主要有以下三点: ReentrantLock等待可中中断 ReentrantLock可以实现公平锁 Reen...

许佳佳的博客 712
上一篇: AbstractQueuedSynchronizer源码解析
下一篇: HashMap源码解析
Cold____
博客等级 码龄7年 110粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值