ReentrantLock和RLock

文章目录

  • 前言
  • 一、 ReentrantLock(单机锁,Java 内置)
    • 示例:
    • 方法详解
  • 二、RLock(分布式锁,Redisson 提供)
    • 示例:
    • 方法详解
  • 三、 对比总结:
  • 四、 如何选择?


前言

ReentrantLock 和 RLock 都是可重入锁(Reentrant Lock),但它们属于不同的锁实现,分别适用于 单机环境 和 分布式环境。

一、 ReentrantLock(单机锁,Java 内置)

ReentrantLock 是 Java 标准库(java.util.concurrent.locks)提供的可重入互斥锁,适用于 单机多线程 场景。特点可重入性:同一个线程可以多次获取同一把锁(避免死锁)。公平/非公平锁:支持公平锁(按等待顺序获取)和非公平锁(默认,允许插队)。可中断:lockInterruptibly() 允许线程在等待锁时响应中断。条件变量:支持 Condition,用于线程间协调(如 await() / signal())。必须手动释放:必须调用 unlock(),否则可能导致死锁。

示例:

ReentrantLock lock = new ReentrantLock();
try {if (lock.tryLock(1, TimeUnit.SECONDS)) { // 尝试获取锁,最多等1秒try {System.out.println("Lock acquired!");} finally {lock.unlock(); // 必须手动释放}}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
}

方法详解

方法说明
lock()阻塞获取锁,如果锁被占用,当前线程会一直等待。
lockInterruptibly()可中断地获取锁,等待过程中可响应 InterruptedException。
tryLock()尝试非阻塞获取锁,成功返回 true,失败返回 false。
tryLock(long timeout, TimeUnit unit)在指定时间内尝试获取锁,超时返回 false。
unlock()释放锁(必须在 finally 块中调用,避免死锁)。
isLocked()判断锁是否被占用(非标准方法,需自定义实现)。
isHeldByCurrentThread()判断当前线程是否持有锁。
getHoldCount()返回当前线程持有锁的次数(可重入计数)。
getQueueLength()返回等待获取锁的线程数(监控用)。
hasQueuedThreads()是否有线程在等待锁。
newCondition()返回 Condition 对象,用于线程间协调(类似 wait/notify)。

二、RLock(分布式锁,Redisson 提供)

RLock 是 Redisson(Redis 客户端)提供的 分布式可重入锁,适用于 多机多进程 环境,基于 Redis 实现。特点可重入性:同 ReentrantLock,支持同一个客户端多次加锁。自动释放(Lease Time):可以设置锁的自动过期时间(防止死锁)。看门狗机制(Watchdog):如果未指定 leaseTime,Redisson 会启动一个后台线程(看门狗)自动续期锁,避免业务未执行完锁就过期。支持高可用:如果 Redis 是集群模式,RLock 仍然可用(Redisson 有 RedLock 算法)。支持异步锁:提供 lockAsync() 等异步方法。

示例:

RLock lock = redisson.getLock("myLock");
try {// 尝试获取锁,最多等10秒,锁自动30秒后释放if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {try {System.out.println("Lock acquired!");// 业务逻辑...} finally {lock.unlock(); // 建议手动释放(即使设置了leaseTime)}}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
}

方法详解

方法说明
lock()阻塞获取锁,默认 看门狗自动续期(防止死锁)。
lock(long leaseTime, TimeUnit unit)获取锁并设置自动释放时间(leaseTime 后自动释放)。
lockInterruptibly()可中断获取锁(支持线程中断)。
tryLock()尝试获取锁,成功返回 true,失败返回 false。
tryLock(long waitTime, long leaseTime, TimeUnit unit)在 waitTime 内尝试获取锁,成功后锁在 leaseTime 后自动释放。
unlock()释放锁(建议在 finally 中调用)。
forceUnlock()强制释放锁(即使当前线程未持有)。
isLocked()判断锁是否被占用。
isHeldByCurrentThread()当前线程是否持有锁。
remainTimeToLive()返回锁的剩余存活时间(TTL)。

三、 对比总结:

在这里插入图片描述

四、 如何选择?

单机应用 ➝ ReentrantLock(更轻量,无网络开销)。
分布式系统 ➝ RLock(基于 Redis,适用于多服务竞争锁)。
需要自动释放 ➝ RLock(设置 leaseTime 防止死锁)。
需要条件变量 ➝ ReentrantLock(Condition 更灵活)。
如果你的应用是 微服务/分布式架构,RLock 是更好的选择;如果是 单机高并发,ReentrantLock 更高效。

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

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

相关文章

thinkphp ThinkPHP3.2.3完全开发手册

惯例配置 应用设定 APP_USE_NAMESPACE > true, // 应用类库是否使用命名空间 3.2.1新增 APP_SUB_DOMAIN_DEPLOY > false, // 是否开启子域名部署 APP_SUB_DOMAIN_RULES > array(), // 子域名部署规则 APP_DOMAIN_SUFFIX > , // 域名后缀 如果是…

Python Day50 学习(仍为日志Day19的内容复习)

补充:梳理超参数调整流程(逻辑) 超参数调节的流程逻辑可以总结为以下几个步骤: 1. 明确目标 确定你要优化的模型和评估指标(如准确率、F1值、AUC等)。 2. 选择要调节的超参数 列出模型中影响较大的超参数…

公司网络变差的解决方法(固定IP地址冲突)

问题描述 最近公司网络变差,不知道为什么。(别的同事反馈的,本人没有感觉变差,也是比较奇怪的现象) 现象有视频会议变卡等。 调查过程 1.领导给网络公司打电话沟通,对面远程看了下,不是设备问…

使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建监控平台

一、监控平台介绍 1.监控平台简述普罗米修斯四件套,分别为Prometheus、Grafana、Alertmanager、Webhook-DingTalk。Prometheus一套开源的监控&报警&时间序列数据库的组合,由SoundCloud公司开发,广泛用于云原生环境和容器化应用的监控和性能分析。其提供了通用的数据…

UR机器人解锁关节扭矩控制:利用英伟达Isaac Lab框架,推动装配自动化的Sim2Real迁移

在工业制造领域,机器人装配长期依赖固定自动化模式,面临部署成本高、适配性差等挑战。多部件装配是制造业、汽车及航空航天等行业中的核心环节。传统装配系统通常针对特定任务设计,依赖大量人工工程部署,灵活性不足,难…

ABB 605系列

系列概述 ABB Relion605系列是专为配电网设计的保护继电器产品系列,代表了中低压电力系统保护领域的技术基准。基于ABB在电力保护领域数十年的经验,该系列集成了最新的数字信号处理技术和网络通信能力,为变电站自动化提供了完整的解决方案。…

Python|GIF 解析与构建(6):手搓 tk 录制工具

目录 Python|GIF 解析与构建(6):手搓 tk 录制工具 一、工具功能概览 二、核心架构设计 1. 帧率控制模块 2. 屏幕捕获模块 3. 主应用模块 三、关键技术解析 1. 屏幕捕获技术 2. 帧率控制原理 3. 透明窗口实现 四、使用指…

在VBA中,提取word表格的文本时,通常有什么干扰符号,需要清除

标题 在VBA中,提取word表格的文本时,通常有什么干扰符号,需要清除 正文 解决问题提取word表格的文本时,通常有什么干扰符号,需要清除 在VBA中提取Word表格文本时,常见的干扰符号及其清除方法如下: ⚠️ 一、主要干扰符…

C++基础学习:深入理解类中的构造函数、析构函数、this指针与new关键字

前言 在C面向对象编程中,类是构建复杂程序的基本单元。今天,我们将深入探讨类中的几个核心概念:构造函数、析构函数、this指针以及new关键字。这些概念对于理解C对象生命周期和内存管理至关重要。 1. 构造函数 构造函数是类的一个特殊成员…

2025 高考游记/总结

坐标GD 新课标一卷选手 前言 思绪有点乱,想想从哪里说起 没想到这个博客已经三年没发过东西了,上次发还是初三准备特长生的时候,一瞬间就已经高考结束了,有种不真实感 对于高中的三年,有很多话、很多感悟想说&#xff…

Python基础之函数(1/3)

函数(基础) [函数后续还会更新两次] 一.认识函数的作用 函数就是将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置,调用这个名称即可完成对应的需求 函数在开发过程中,可以更高效的实现代码重用 二.函数的使用步骤 1定义函…

AWS CloudFormation实战:构建可复用的ECS服务部署模板

一、前言 在云原生时代,基础设施即代码(IaC)已成为DevOps实践的核心组件。AWS CloudFormation作为AWS原生的IaC服务,允许开发人员和系统管理员以声明式方式定义和部署AWS资源。本文将深入探讨如何构建一个通用的CloudFormation模板,用于在AWS ECS(Elastic Container Servic…

GRUB2 启动配置的工作原理与优先级规则详解

一、核心组件概述 /boot/loader/entries/ 类型:目录,存储 BLS (Boot Loader Specification) 格式的启动项配置文件(如 20-custom-kernel-5.14.0.conf)。管理工具:由 grubby、kernel-install 等工具自动生成或修改。配置内容:每个文件定义一个启动项的详细参数(内核路径、…

网页版便签应用开发:HTML5本地存储与拖拽交互实践

文章目录 摘要成品显示核心功能与实现语法1. 本地存储管理2. 拖拽功能实现3. 自动保存机制4. 时间格式化处理 完整代码 摘要 本文详细介绍了一个基于HTML5的便签应用开发过程,重点讲解了如何利用localStorage实现数据持久化存储,以及如何实现流畅的拖拽…

docker compose安装Prometheus、Grafana

1、创建目录结构 mkdir -p /opt/monitoring/{prometheus,grafana} mkdir -p /opt/monitoring/prometheus/{config,data} chmod -R 777 /opt/monitoring # 确保容器有写入权限 2、准备 Prometheus 配置文件 vi /opt/monitoring/prometheus/config/prometheus.yml global:sc…

稀土化合物在生态环境的应用

稀土化合物凭借强吸附性、催化活性及环境兼容性,已成为生态治理的关键材料。氧化物、氯化物、磷酸盐等基础产品,通过灵活复配与工艺适配,可高效解决水体净化、土壤修复、废气处理三大核心问题,推动环境治理向低耗高效转型。那么&a…

搭建网站应该怎样选择服务器?

互联网技术已经全面在各个地区进行发展,越来越多的企业选择线上业务,搭建属于自己的网站运营,以此来增加品牌的知名度并进行详细介绍,但是企业在进行搭建网站的前提,要选择一种合适的服务器,确保后续网站能…

每日算法刷题Day30 6.13:leetcode二分答案2道题,用时1h10min

5. 1201.丑数III(中等) 1201. 丑数 III - 力扣(LeetCode) 思想 1.丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。 2.此题是4. 878.第N个神奇数字的进阶版&#…

Appium+python自动化(二十一)- Monkey指令操作手机

第一式 - 隐藏命令 monkey隐藏的两个命令&#xff1a; –pck-blacklist-file<黑名单文件><br><br>–pck-whitelist-file<白名单文件> monkey还有一个隐藏的命令那就是&#xff1a; –f<脚本文件>:可以指定monkey的自定义脚本 一般monkey测试…

微信小程序动态效果实战指南:从悬浮云朵到丝滑列表加载

小红书爆款交互设计解析&#xff0c;附完整代码&#xff01; &#x1f525; 一、为什么动态效果是小程序的关键竞争力&#xff1f; 用户留存提升&#xff1a;数据显示&#xff0c;86.3%的微商从业者依赖微信小程序&#xff0c;而动态效果能显著降低跳出率。技术赋能体验&#…