ReentrantLock-可重入锁

news/2025/1/15 15:54:07/文章来源:https://www.cnblogs.com/demon001/p/18404226

ReentrantLock是Java并发包java.util.concurrent.locks中的一个类,它实现了Lock接口,提供了一种与Synchronized方法和语句相同的基本行为和语义的互斥锁,但具有更多的扩展功能。

主要特点

  • 可重入性
    与 synchronized 关键字一样,ReentrantLock 允许同一个线程多次获得锁,而不会发生死锁。每次成功获取锁后,锁的持有计数会增加,每次释放锁时,计数会减少。只有当计数为0时,锁才完全释放,其他线程才能获取该锁。
  • 公平性
    ReentrantLock 构造函数接受一个可选的 boolean 类型的 fairness 参数。如果设置为 true,则锁将按照请求锁的顺序(即等待时间最长的线程将优先获得锁),来授予访问权限。这有助于减少饥饿现象,但可能会降低吞吐量。如果设置为 false(默认值),则不保证任何特定的访问顺序。
  • 尝试非阻塞地获取锁
    ReentrantLock 提供了 tryLock() 方法,该方法尝试获取锁,如果锁可用,则立即返回 true,否则立即返回 false。这与 synchronized 关键字不同,后者在锁不可用时会使线程阻塞。
  • 可中断的锁获取
    ReentrantLock 支持可中断的锁获取操作,即线程在等待锁的过程中可以被中断。这通过 lockInterruptibly() 方法实现,如果当前线程在等待锁的过程中被中断,则会抛出 InterruptedException。
  • 条件变量
    与 synchronized 关键字不同,ReentrantLock 提供了条件变量(Condition),允许多个条件等待集。这允许更灵活的线程同步控制。

使用建议

  • 防止死锁
    使用try-finally语句,在调用lock()方法后,应立即使用try-finally语句来确保锁最终会被释放;
  • 考虑公平性
    如果实际应用场景中,锁的获取顺序很重要,或者希望减少饥饿现象,可以考虑将 fairness 参数设置为 true。但请注意,这可能会降低系统的吞吐量。
  • 避免过度使用
    虽然 ReentrantLock提供了比synchronized更多的功能,但过度使用可能会使代码变得复杂且难以维护。在大多数情况下,synchronized 关键字已经足够使用。

示例代码

class ReentrantLockSample {// 默认非公平锁private final ReentrantLock lock = new ReentrantLock();// 公平锁// private final ReentrantLock lock = new ReentrantLock(true);  public void method() {// 尝试获取锁  lock.lock();try {  // ... 方法体  } finally {  // 释放锁  lock.unlock(); }  }  
}

在这个例子中,lock.lock() 尝试获取锁,如果锁被其他线程持有,则当前线程将阻塞,直到锁被释放。在 try 块中执行的方法体完成后,无论是否发生异常,finally 块都会确保锁被释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出库申请单、其他出库单套件使用指南

出库申请单、其他出库单套件使用指南 出库申请单使用套件需要把业务类型​修改为空 点击套件展开或者保存时会自动展开套件​​ ‍ 其他出库单 如图,套件的单据,新明细会出现在第一个标签,只有一个删除行的功能。 修改新明细​中的数量会自动联动到明细信息​中 ​​ ‍博客…

程序安装:不会安装该公布程序,因为它可能不安全,请与管理员联系解决办法

程序安装:不会安装该公布程序,因为它可能不安全,请与管理员联系解决办法 删除注册表中Products下的项。该方法确实能解决问题,但为防止误删其他软件注册信息,将此法作如下改进,发现依然好使: 将注册表中 HKEY_CURRENT_USER \ Software \ Microsoft \ Installer \ Produc…

KernelWarehouse:英特尔开源轻量级涨点神器,动态卷积核突破100+ | ICML 20242A

动态卷积学习n个静态卷积核的线性混合,加权使用它们输入相关的注意力,表现出比普通卷积更优越的性能。然而,它将卷积参数的数量增加了n倍,因此并不是参数高效的。这导致不能探索n>100的设置(比典型设置n<10大一个数量级),推动动态卷积性能边界提升的同时享受参数的…

tarjan—算法的神(一)cw

本篇包含 tarjan 求强连通分量、边双连通分量、割点 部分, tarjan 求点双连通分量、桥(割边)在下一篇。伟大的 Robert Tarjan 创造了众多被人们所熟知的算法及数据结构,最著名的如:(本文的)连通性相关的 tarjan 算法,Splay-Tree,Toptree,tarjan 求 lca 等等。 注:有…

【微信小程序反编译】入门1

原创 zkaq - Tobisec 掌控安全EDU一、前言 这几天在跟着师傅一起学习微信小程序的相关知识点,前面的微信小程序的漏洞挖掘蛮简单的,但是到后面需要黑盒测试了,就需要我们对小程序进行一个反编译,进行一个代码审计相关的知识点了。 小程序的反编译相关工具有好几个,下面我给…

代码随想录day55 || 图论5

并查集197 图中是否存在有效路径 var father []int func validPath(n int, edges [][]int, source int, destination int) bool {// 使用并查集算法,涉及到的操作,包括init,find, issample,joinfather = make([]int, n)for i, _ := range father { // initfather[i] = i}…

D45XT120-ASEMI无人机专用D45XT120

D45XT120-ASEMI无人机专用D45XT120编辑:ll D45XT120-ASEMI无人机专用D45XT120 型号:26MT160 品牌:ASEMI 封装:DXT-5 批号:2024+ 现货:50000+ 最大重复峰值反向电压:1200V 最大正向平均整流电流(Vdss):45A 功率(Pd):大功率 芯片个数:5 引脚数量:5 安装方式:直插 类型…

golang中关于死锁的思考与学习

1、Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。 必要条件: 如果在一个系统中以下四个条件同时成立,…

ASP.NET 8 AOT 遍历文件夹获取文件名称及时长

朋友下了N多视频记不住文件夹下都有啥了…问批处理怎么导出文件夹下所有文件名及视频时长…批处理导出文件名好弄,获取视频时长真没用过…想到 .net 控制台程序 AOT 发布,不和批处理差不多效果…新建个控制台项目选下使用AOT 首先要获取文件的时长,我们需要用下 TagLibSharp…

公安网络信息体系能力分类

来源:中国电子科学研究院学报,《公安网络信息体系顶层设计》

轮胎充气压力 气压单位换算 All In One

轮胎充气压力 & 气压单位换算 All In One bar / psi 1 bar = 14.5 psi轮胎充气压力 & 气压单位换算 All In Onebar / psi气压单位换算 1 bar = 14.5 psi demos(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.cnblog…

【工具推荐】xxl-jobExploitGUI - xxl-job一键漏洞利用工具+一键getshll

工具介绍 xxl-jobExploitGUI实现了XXL-JOB默认accessToken权限绕过漏洞的单个检测、批量检测、一键反弹shell功能,后续会持续更新优化,添加POC检测等。 下载链接: 链接: https://pan.quark.cn/s/55ed00b1512d使用说明 单个检测批量检测 fofa语句: body="{\"code\…