ReentrantLock的特点

5GS 协议栈 — PFCP 协议 — URR 用量上报规则 目录 文章目录目录URR 用量上报规则UEE 的参数Usage Report 的参数示例 URR 用量上报规则 29244 5.2.2 Usage Reporting Rule URR 的作用? 用来告诉 UPF 如何对 PDR 识别的 SDF 或 Application 业务进行使用量统计信息的上报。CP 收到 Report Information 后,可用于计费或者管控(e.g. 超量限速)等用途。 URR 在哪个流程里下发的? N4 会话建立流程。 N4 会话修改流程。 URR 是怎么工作 阅读详情

一 概述

自JDK5起,Java类库中新提供了java.util.concurrent包,其中的java.util.concurrent.locks.Lock接口便成了Java的另一种全新的互斥同步手段。基于Lock接口,用户能够以非块结构(Non-Block Structured)来实现互斥同步,从而摆脱了语言特性的束缚,改为在类库层面去实现同步,这也为日后扩展出不同的调度算法,不同特征,不同性能,不同语义的各种锁。

二 ReentrantLock(重入锁)

重入锁(ReenturantLock)是Lock接口最常见的一种实现,顾名思义,它与synchronized一样是可重入的,在基本用法上,ReentrantLock也与synchronized很相似,只是代码实现方法上有些区别而且,另外一个很直接的区别是synchronized为Java中的一个关键字而ReentrantLock是一个接口。

此外,ReentrantLock与synchronized相比增加了一些高级功能,主要有以下三项:等待可中断,可实现公平锁及锁可以绑定多个条件。

等待可中断:是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。可中断特性对处理执行时间非常长的同步块很有帮助。

公平锁:是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;而非公平锁则不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁。synchronized中的锁时非公平的,ReentrantLock在默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁不过一旦使用了公平锁,将会导致ReentrantLock的性能急剧下降,会明显影响吞吐量。

public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

锁定多个条件:是指一个ReentrantLock对象可以同时绑定多个Condition对象。在synchronized中,锁对象的wait()和它notify()或者是notifyAll()方法配合可以实现一个隐含的条件,如果要和多于一个的条件关联时候,就不得不额外添加一个锁;而ReentrantLock则无须这样做,多次调用newCondition()方法即可。

三 sychronized和ReentrantLock的性能比较

JDK5之前synchronized对性能的影响是非常明显的,为此在JDK6中专门对性能做出了优化(根据对资源的竞争激烈程度进行的, 在几乎无竞争的条件下, 会使用偏向锁, 在轻度竞争的条件下, 会由偏向锁升级为轻量级锁, 在重度竞争的情况下, 会升级到重量级锁。)

以synchronized和ReentrantLock的性能对比,Brian Goetz对两种锁在JDK5,单核处理器及双Xeon处理器环境下一组吞吐量对比的实验,结果图像如下:

由此可得,多线程环境下synchronized的吞吐量下降的非常严重,而ReentrantLock则能基本保持在同一个相对稳定的水平上,当时于其说ReentrantLock性能好,不如说当是synchronized存在非常大优化余地,在JDK6中针对synchronized加入了大量优化措施,这时候相同的测试中synchronized与ReentrantLock的性能基本基本上能够持平。

基于上述条件可知,是否可以直接使用ReentrantLock替换synchronized,答案不是,因为synchronized是在Java语法层面的同步,足够清晰,也足够简单。每个Java程序员都熟悉synchronized,当时JUC中的Lock接口则并非如此。因此在只需要基础的同步功能时,更推荐synchronized。

Lock应该确保在finally块中释放锁,否则一旦受到同步保护的代码块中抛出异常,则有可能永远不会释放持有的锁。所以程序员要自己来通过代码来保证,而使用synchronized的话则可以由java虚拟机来确保使用出现异常,锁也能自动释放。

尽管在JDK5时代ReentrantLock曾经在性能上领先过synchronized,但这已经是十多年之前的情况。从长远来看,Java虚拟机更容易针对synchronized来进行优化,因为Java虚拟机可以在线程和对象的元素据中记录synchronized中锁的相关信息,而使用JUC中的Lock的话,Java虚拟机是很难得知具体哪些锁对象是特定线程持有的。

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

相关推荐

AUTOSAR RTE配置实战:从ECU分区到Task映射的完整指南

本文提供了一份AUTOSAR RTE配置的完整实战指南。从创建ECU分区、定义OS任务,到实现Runnable Entity与Task的精确映射,详细解析了每一步的操作要点与常见陷阱。文章结合配置工具界面,旨在帮助开发者高效完成RTE配置,确保系统实时性与数据一致性,是掌握AUTOSAR核心开发流程的实用参考。

weixin_29228203的博客 484

ReentrantLock

ReentrantLock是Java中的一个可重入锁实现,它提供了和synchronized关键字类似的线程同步功能,但相比synchronized更加灵活和可控。ReentrantLock可以用于实现线程间的互斥访问,避免了线程间的竞争和死锁问题。

m0_43582028的博客 590

【02】【VisionMaster V4.0.0 】安装教程—— 授权文件更新报错:应用程序与本地LM通讯出错(怀疑电脑加密 和 上网受限 造成的 )

本文详细介绍了海康VisionMaster 4.0试用版的安装流程及常见问题解决方案。主要内容包括:1)从官网下载基础安装包、试用补丁和授权文件;2)按顺序安装主程序、补丁和授权文件;3)针对授权失败问题提供两种解决方案(更换未加密电脑或使用加密狗);4)说明试用版的功能限制(30天试用期、2个流程限制等)。文章特别指出电脑加密可能导致授权失败,并提供了安装报错时的处理建议,为初次使用者提供了完整的安装指导。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 7152

ReentrantLock详解

ReentrantLock使用,

weixin_56738054的博客 1万+

施耐德EcoStruxure平台深度体验:IEC 61499在智慧物流中心的真实应用案例解析

本文深度解析施耐德EcoStruxure平台在智慧物流中心的应用,重点探讨IEC 61499标准如何通过分布式控制和功能块技术重构自动化逻辑。通过上海某物流中心的真实案例,展示了该平台在提升系统弹性、降低停机成本方面的显著成效,为工业自动化转型提供实践参考。

weixin_30576827的博客 66

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

corgi2020的博客 2000

Java并发基石ReentrantLock:深入解读其原理与实现

被称为“可重入锁”,是一个同步工具类,在java.util.concurrent.locks包下。这种锁的一个重要特点是,它允许一个线程多次获取同一个锁而不会产生死锁。这与关键字提供的锁定机制非常相似,但提供了更高的扩展性。的实现依赖于内部的Sync类,这个类是(AQS)的一个实现。AQS是Java并发库中许多同步工具(包括Semaphore和等)的核心。AQS使用一个int类型的变量来表示同步状态,用它来表示锁的持有计数和持有线程的信息。当计数为0时,表示锁未被任何线程持有。

码到三十五 5万+

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 251

详解Java可重入锁ReentrantLock

Java的`ReentrantLock`是一个高级的线程同步工具,提供了比传统的`synchronized`方法和语句更灵活、更丰富的线程同步机制。这个锁属于可重入锁(也称为递归锁),意味着同一个线程可以多次获取同一个锁而不会产生死锁。下面详细解释和说明`ReentrantLock`的特性和用法

常备不懈 1786

实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?

本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。

weixin_42634811的博客 344

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1305

ReentrantLock的定义和特性

ReentrantLock是Java中的可重入互斥锁,提供线程同步功能。支持公平/非公平模式,允许线程重复获取锁且不会死锁。特性包括可中断锁获取、超时尝试锁及Condition条件变量。需手动加锁解锁,相比synchronized更灵活控制并发,适用于复杂多线程场景。

weixin_46084191的博客 1160

PyTorch实战(2)——使用PyTorch构建神经网络

在本节中,我们使用 PyTorch 在简单数据集上构建了一个神经网络,训练神经网络来映射输入和输出,并通过执行反向传播来更新权重值以最小化损失值,并利用 Sequential 类简化网络构建过程;介绍了获取网络中间值的常用方法,以及如何使用 save、load 方法保存和加载模型,以避免再次训练模型。

盼小辉丶的博客 1万+

synchronized和ReentrantLock各自的特点

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

默默无闻的黄先生的博客 237

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

synchronized、ReentrantLock、Semaphore、AtomicInteger四种线程锁的特点,性能比较、与使用场景

多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求。 使用多线程的理由之一是和进程相比,它是一种非常花销小,切换快,更”节俭”的多任务操作方式。 在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而在进程中的同时运行多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进

qq_36194388的博客 2262

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

4种常用线程锁synchronized、ReentrantLock、Semaphore、AtimicInteger的特点,性能比较、使用场景

一、背景介绍 1、在进程中的同时运行多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间, 线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。 2、在Java并发编程中,经常遇到多个线程访问同一个 共享资源 ,开发者必须考虑如何维护数据一致性,这就是Java锁机制(同步问题)的来源。 ...

promiseful的博客 726

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

4.9 ReentrantLock、ReentrantReadWriteLock、StampedLock实现原理以及特点;

ReentrantLock java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。 而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。 ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。 (1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。 ReentrantLock也是独占锁,加锁和解锁的过程..

服务端开发进阶之路 316

Java中synchronize与ReentrantLock两种锁特点介绍

一、两种锁特性总览: synchronize:隐式锁(内置锁),重量级锁,重入锁,非公平锁; ReentrantLock:显式锁,轻量级锁,重入锁,具有公平锁和非公平锁两种方式; 二、锁特点介绍: 2.1 隐式和显式 隐式锁:程序能够自动获取锁和释放锁,无需手动创建和删除,在非逻辑问题的情况下,是不会出现死锁问题的。 synchronize修饰普通方法: public synchronized void method() { } synchronize修饰静态方法: pub...

狗狗大蛇 518

简单了解 重入锁 (ReentrantLock)的使用以及特点

重入锁使用类来实现,使用案例如下所示: 重入锁与synchronized相比,有着明显的操作过程,开发必须手动指定何时加锁,注意,退出临界区的时候,必须释放锁,否则其他线程就没有机会访问临界区了。 重入锁提供了无条件的、可轮询的、定时的以及可中断的锁获取操作。 在这种情况下,一个线程连续获得同一把锁,这是被允许的,否则同一个线程就会在第二次获得锁的时候与自己产生死锁。注意:如果同一个线程多次获得锁,那么在释放锁的时候也必须释放相同的次数!如果释放的多了,就会得到一个异常;反之,则相当于线程还持有这个

qq_42055887的博客 597

【并发编程 源码解析】从源码角度分析 ReentrantLock 的几个特点

参考《Java并发编程之美》,给源码加点注释,正确率有保证,请先理解用法,再来食用!

qq_55477069的博客 1277

Java | ReentrantLock 锁和 synchronized 锁的区别和共同特点是什么?

Java | ReentrantLock 锁和 synchronized 锁的区别和共同特点是什么?

liuruiaaa的博客 932

reentrantlock非公平锁不会随机挂起线程?_工作常用4种Java线程锁的特点,性能比较、使用场景...

多线程的缘由在出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求。使用多线程的理由之一是和进程相比,它是一种非常花销小,切换快,更”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而在进程中的同...

weixin_39703468的博客 76

reentrantlock非公平锁不会随机挂起线程?_程序员进阶架构师:4种常用Java线程锁的特点,性能比较及使用场景...

多个线程同时对同一个对象进行读写操作,很容易会出现一些难以预料的问题。所以很多时候我们需要给代码块加锁,同一时刻只允许一个线程对某个对象进行操作。多线程之所以会容易引发一些难以发现的bug,很多时候是写代码的程序员对线程锁不熟悉或者干脆就没有在必要的地方给线程加锁导致的。本篇我想分享java多线程中的4种常见线程锁的特点、性能比较及使用场景。多线程的缘由在出现了进程之后,操作系统的性能得到了大大的...

weixin_39940425的博客 88

ReentrantLock与AQS

获取锁 lock() lockInterruptibly() tryLock() tryLock(long time, TimeUnit unit)await(long time, TimeUnit unit);调用Condition的await()和signal()方法,都必须在lock保护之内。等待/通知机制 和 多条件协调(与他相反的是Object仅有一个内置的等待机制)非公平锁在lock的时候,会先进行一次cas,失败了再入队。,更加灵活的wait()和notify()机制,

m0_70448456的博客 231

【六大锁策略-各种锁的对比-Java中的Synchronized锁和ReentrantLock锁的特点分析-以及加锁的合适时机】

轻量级锁适用于竞争不激烈的情况,而重量级锁适用于竞争激烈的情况。在实际开发中,我们需要根据具体场景选择合适的锁机制,以达到最佳的性能

学习愚公的博客 965

reentrantlock java_java ReentrantLock详解

介绍ReentrantLock称为重入锁,比内部锁synchonized拥有更强大的功能,它可中断、可定时、设置公平锁【注】使用ReentrantLock时,一定要释放锁,一般释放放到finnal里写。提供以下重要的方法lock():获得锁,如果锁已被占用,则等待lockInterruptibly():获得锁,但有限响应中断unlock():释放锁tryLock():尝试获取锁。如果获得,返回tr...

weixin_33493816的博客 428
上一篇: 破坏双亲委派模型
下一篇: Java虚拟机栈(Java Virtual Machine Stack)
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值