Java 的 ReentrantLock

Java中的ReentrantLockjava.util.concurrent.locks包下提供的一个可重入互斥锁,用于替代synchronized关键字实现更灵活的线程同步。以下是其核心特性和使用方法的详细说明:


核心特性

  1. 可重入性
    同一个线程可以重复获取同一个锁(锁的持有计数器递增),避免死锁。例如,递归调用或嵌套同步块时无需重复释放锁。
  2. 公平性选择
    构造函数支持创建公平锁fair = true)或非公平锁(默认)。
    • 公平锁:按请求顺序分配锁,避免线程饥饿,但性能较低。
    • 非公平锁:允许插队,提高吞吐量,但可能导致某些线程长期等待。
  3. 灵活的锁控制
    支持tryLock()(尝试非阻塞获取锁)、lockInterruptibly()(可中断的锁请求)和超时机制,避免无限等待。
  4. 条件变量(Condition)
    通过newCondition()创建多个Condition实例,实现线程间精确的等待/唤醒机制。

核心方法

方法说明
lock()获取锁,若锁被占用则阻塞等待。
unlock()释放锁,必须在finally块中调用。
tryLock()尝试立即获取锁,成功返回true,否则返回false
tryLock(timeout, unit)在指定时间内尝试获取锁。
lockInterruptibly()获取锁,但允许被其他线程中断。
isHeldByCurrentThread()检查当前线程是否持有锁。

代码示例

1. 基本用法
ReentrantLock lock = new ReentrantLock();public void safeMethod() {lock.lock();try {// 临界区代码} finally {lock.unlock();}
}
2. 尝试获取锁
if (lock.tryLock(1, TimeUnit.SECONDS)) {try {// 成功获取锁后的操作} finally {lock.unlock();}
} else {// 超时后的备选方案
}
3. 使用Condition实现生产者-消费者
ReentrantLock lock = new ReentrantLock();
Condition notEmpty = lock.newCondition();
Condition notFull = lock.newCondition();
Queue<Integer> queue = new LinkedList<>();
int capacity = 10;// 生产者
public void produce(int value) throws InterruptedException {lock.lock();try {while (queue.size() == capacity) {notFull.await(); // 等待队列非满}queue.add(value);notEmpty.signal(); // 通知消费者} finally {lock.unlock();}
}// 消费者
public int consume() throws InterruptedException {lock.lock();try {while (queue.isEmpty()) {notEmpty.await(); // 等待队列非空}int value = queue.remove();notFull.signal(); // 通知生产者return value;} finally {lock.unlock();}
}

与synchronized的对比

特性ReentrantLocksynchronized
锁获取方式显式调用lock()unlock()隐式通过代码块或方法
可中断性支持(lockInterruptibly()不支持
超时机制支持tryLock(timeout)不支持
公平性可配置公平或非公平锁仅非公平锁
条件变量支持多个Condition单一wait()/notify()

适用场景

  • 需要细粒度控制锁(如超时、可中断)。
  • 需要公平性策略(如任务调度系统)。
  • 需要多个条件变量(如生产者-消费者模型中的不同等待条件)。
  • 需要尝试获取锁的非阻塞逻辑。

实现原理

ReentrantLock 的核心逻辑委托给内部类 Sync,而 Sync 继承自 AQS。AQS 是一个用于构建锁和同步器的框架,通过 状态(state)CLH 队列(Craig, Landin, and Hagersten 队列,一种 FIFO 双向队列)管理线程的竞争与调度。

  • 状态(state)
    AQS 的 state 字段表示锁的持有次数(可重入性)。
    • state = 0:锁未被任何线程占用。
    • state > 0:锁被占用,值表示当前线程的重入次数。
  • CLH 队列
    竞争锁失败的线程会被封装为 Node 对象,加入 CLH 队列等待唤醒。队列通过 CAS 操作保证线程安全。

是否是公平锁的区别在于:线程获取锁时是加入到 CLH 队列尾部还是直接利用 CAS 争抢锁。

注意事项

  1. 必须释放锁
    确保在finally块中调用unlock(),防止死锁。
  2. 避免嵌套死锁
    重入次数必须与释放次数匹配(例如,加锁两次需解锁两次)。
  3. 性能考量
    在低争用情况下,synchronized性能接近或优于ReentrantLock;高争用时需测试选择。

通过合理使用ReentrantLock,可以显著提升多线程程序的灵活性和可靠性,尤其在需要复杂同步逻辑的场景中表现突出。

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

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

相关文章

达梦数据库-学习-23-获取执行计划的N种方法

目录 一、环境信息 二、说点什么 三、测试数据生成 四、测试语句 五、获取执行计划方法 1、EXPLAIN &#xff08;1&#xff09;样例 &#xff08;2&#xff09;优势 &#xff08;3&#xff09;劣势 2、ET &#xff08;1&#xff09;开启参数 &#xff08;2&#xff…

20200201工作笔记常用命令要整理

工作笔记常用命令&#xff1a; 1.repo常用命令&#xff1a; repo sync -c -j10 2. 常用adb命令 错误: error: device unauthorized. This adbds $ADB_VENDOR_KEYS is not set; try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your d…

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览 到2025年&#xff0c;虽然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在学术界仍有探讨&#xff0c;但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调&#xff08;PEFT&#xff09;方法取代 。LoRA因其实现简单、推理零开销&#…

9种方法,一键美化Python图表

Matplotlib、Seaborn默认参数不好看&#xff0c;美化需要大量代码。 本次分享9种方法&#xff0c;一键美化图表&#xff0c;看看那个是你的菜。 1 Matplotlib style sheets Matplotlib内置多类style sheets&#xff0c; 一行代码使用&#xff0c; plt.style.use(Solarize_Li…

在STM32上配置图像处理库

在STM32上配置并使用简单的图像滤波库(以实现均值滤波为例,不依赖复杂的大型图像处理库,方便理解和在资源有限的STM32上运行)为例,给出代码示例,使用STM32CubeIDE开发环境和HAL库,假设已经初始化好了相关GPIO和DMA(如果有图像数据传输需求),并且图像数据存储在一个二…

Android四大组件学习总结

​1. Activity 启动模式问题​ ​面试官​&#xff1a; “我看你项目里用了 SingleTask 模式&#xff0c;能具体说说为什么用它吗&#xff1f;如果从 Activity A&#xff08;SingleTask&#xff09;跳转到 B&#xff08;Standard&#xff09;&#xff0c;再返回 A&#xff0c;…

基于SamOutV8的序列生成模型实现与分析

项目概述 本项目实现了基于SamOutV8架构的序列生成模型&#xff0c;核心组件包括MaxStateSuper、FeedForward和DecoderLayer等模块。通过结合自注意力机制与状态编码策略&#xff0c;该模型在处理长序列时表现出良好的性能。 核心组件解析 1. MaxStateSuper&#xff08;状态编…

从脑电图和大脑记录中学习稳健的深度视觉表征

从脑电图和大脑记录中学习稳健的深度视觉表征 印度&#xff0c;印度&#xff0c;印度&#xff0c;印度大脑实验室&#xff0c;印度 例如&#xff0c;达拉普&#xff0c;克普拉萨德&#xff0c;山&#xff0c;山&#xff0c;新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…

2025.5个人感悟

本人是一名2025级大四学生&#xff0c;离毕业就一个月了&#xff0c;目前论文终稿已写完&#xff0c;有多的时间可以来写一写博客了。 &#xff08;1&#xff09;越焦虑什么&#xff0c;未来就有可能变成什么样子。以前一直焦虑考不上研&#xff0c;秋招找不到工作&#xff0c…

使用腾讯云3台轻量云服务器快速部署K8s集群实战

一、服务器配置 1.集群数量 节点ip备注master10.0.4.9安全组放通&#xff0c;3节点内网互通node110.0.4.14安全组放通&#xff0c;3节点内网互通node210.0.4.17安全组放通&#xff0c;3节点内网互通 2.配置服务器&#xff08;每个节点执行&#xff09; 执行步骤1 #在对应的…

bitbar环境搭建(ruby 2.4 + rails 5.0.2)

此博客为武汉大学WA学院网络安全课程&#xff0c;理论课大作业Web环境搭建。 博主搭了2天&#xff01;&#xff01;&#xff01;血泪教训是还是不能太相信ppt上的教程。 一开始尝试了ppt上的教程&#xff0c;然后又转而寻找网络资源 cs155源代码和docker配置&#xff0c;做到…

leetcode:2469. 温度转换(python3解法,数学相关算法题)

难度&#xff1a;简单 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数…

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

多视角三维重建系统 下面我将实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。 1. 环境准备与数据加载 首先安装必要的库: pip install opencv-python opencv-contrib-python numpy matplotlib plotly s…

什么是国密、密评、商密

一、国密 定义与本质&#xff1a;国密即国家密码管理局公布认定的国产密码算法&#xff0c;也称为商用密码&#xff08;在此语境下与国密通用&#xff09;&#xff0c;指能够实现商用密码算法的加密、解密和认证等功能的技术&#xff0c;涵盖密码算法编程技术和密码算法芯片、…

打卡35天

模型可视化与推理 知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化 进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观 推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&…

kafka之操作示例

一、常用shell命令 #1、创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看创建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生产者发布消息命令 &#xff08;执行完此命令后在控制台输入要发…

网络安全基础--第七课

路由表 路由器的转发原理&#xff1a;当一个数据包进入路由器&#xff0c;路由器将基于数据包中的目标IP地址&#xff0c;查询本地 路由表&#xff0c;若表中存在记录&#xff0c;则将无条件按记录转发&#xff0c;若没有记录&#xff0c;路由器不能泛洪&#xff0c;因为路由器…

Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果

书接上回&#xff1a;springBoot 整合 扣子cozeAI 智能体 对话https://blog.csdn.net/weixin_44548582/article/details/147457236 上文实现的是一次性等待并得到完整的AI回复内容&#xff0c;但随着问题和AI的逻辑日趋复杂&#xff0c;会明显增加这个等待时间&#xff0c;这对…

《AVL树完全解析:平衡之道与C++实现》

目录 AVL树的核心概念数据结构与节点定义插入操作与平衡因子更新旋转操作&#xff1a;从理论到代码双旋场景深度剖析平衡检测与测试策略性能分析与工程实践总结 0.前置知识&#xff1a;BS树 代码实现部分对和BS树相似的部分会省略。 1. AVL树的核心概念 1.1 平衡二叉搜索树…

跨平台游戏引擎 Axmol-2.6.0 发布

Axmol 2.6.0 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 &#x1f64f;感谢所有贡献者及财务赞助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 相对于2.5.0版本的重要变更&#xff1a; 通…