Redisson 分布式锁获取tryLock和lock的区别

问题

boolean isLock = lock.tryLock(10, 30, TimeUnit.SECONDS);
boolean isLock = lock.lock(30, TimeUnit.SECONDS);
boolean isLock = lock.lock();
三者的区别??

这三个方法都是用于获取 Redisson 分布式锁的,但它们在获取锁的方式和行为上有一些区别。下面是这三种方法的具体区别:

1. lock.tryLock(long waitTime, long leaseTime, TimeUnit unit)

作用:
  • 这个方法尝试获取锁,并且会在指定的时间内(waitTime)等待锁的释放。如果在指定时间内能够获取到锁,则会继续执行,否则会返回 false
  • 获取到锁后,锁会持有指定的时间(leaseTime),即使锁的持有者没有主动释放锁,锁也会在超时后自动释放。leaseTime 是锁的持有时间,单位是 TimeUnit(比如秒、毫秒等)。
参数:
  • waitTime: 获取锁的最大等待时间。如果在这个时间内获取不到锁,方法会返回 false
  • leaseTime: 锁的持有时间,即使持有锁的线程没有主动释放锁,leaseTime 时间到期后,锁会自动释放。
  • unit: 时间单位(秒、毫秒等)。
示例:
boolean isLock = lock.tryLock(10, 30, TimeUnit.SECONDS);
  • 该方法会在最多 10 秒内尝试获取锁,获取到锁后,锁会持有 30 秒。如果 10 秒内没有获取到锁,方法返回 false
使用场景:
  • 如果你只想等待一定的时间去获取锁,并且知道如果获取不到锁就不继续执行,那么使用 tryLock
  • 适用于需要“获取锁失败”时不阻塞当前线程的场景。

2. lock.lock(long leaseTime, TimeUnit unit)

作用:
  • 这个方法会阻塞当前线程,直到获取到锁为止。与 tryLock 的不同之处在于,它不会限制等待锁的时间,线程会一直阻塞直到成功获取到锁。
  • 获取到锁后,锁会持有指定的时间(leaseTime)。在超时之前,锁会被自动释放。
参数:
  • leaseTime: 锁的持有时间,如果持有锁的线程没有主动释放锁,leaseTime 时间到期后,锁会自动释放。
  • unit: 时间单位(秒、毫秒等)。
示例:
boolean isLock = lock.lock(30, TimeUnit.SECONDS);
  • 该方法会阻塞当前线程,直到获取到锁。获取到锁后,锁会持有 30 秒。
使用场景:
  • 如果你希望当前线程获取锁后,阻塞并执行业务逻辑,直到锁的持有时间超时或者线程完成操作。
  • 如果你不关心等待多长时间,只要能够获得锁并执行业务,适合使用此方法。

3. lock.lock()

作用:
  • 这个方法是最简单的获取锁的方式,它会无限期地阻塞直到获取到锁为止。获取到锁后,线程持有锁直到显式调用 unlock() 来释放锁。
  • 与前两者的区别是,它没有超时设置,锁会一直被持有直到调用 unlock() 来显式释放。
参数:
  • 无参数。
示例:
lock.lock();
  • 该方法会阻塞当前线程,直到获取到锁。锁会一直持有,直到显式调用 unlock() 释放锁。
使用场景:
  • 如果你确定当前线程在获取锁后需要一直执行,直到任务完成且没有超时的考虑,使用该方法是最直接的方式。
  • 适用于锁的生命周期和当前线程的生命周期一致的场景。

总结对比:

方法是否会阻塞是否有超时锁的持有时间用途
tryLock(long waitTime, long leaseTime, TimeUnit unit)(如果获取不到锁,会等 waitTime有超时waitTimeleaseTime超时后自动释放锁用于短时间等待获取锁,不获取锁则不执行业务
lock(long leaseTime, TimeUnit unit)(一直阻塞直到获取到锁)有超时leaseTime超时后自动释放锁用于无限期等待获取锁,锁自动释放
lock()(一直阻塞直到获取到锁)无超时锁持有直到显式调用 unlock()用于长期持有锁,直到显式释放

推荐场景:

  • tryLock:适用于你希望尝试获取锁但又不想长时间阻塞的场景。如果无法获取锁,你可以采取其他措施(比如返回失败或重试)。
  • lock(long leaseTime, TimeUnit unit):适用于希望获取锁后,进行一定时间的操作后自动释放锁的场景。
  • lock():适用于你希望线程获取锁后一直执行任务,直到任务完成且显式释放锁的场景。

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

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

相关文章

【机器学习】机器学习的基本分类-半监督学习(Semi-supervised Learning)

半监督学习是一种介于监督学习和无监督学习之间的机器学习方法。它利用少量的标注数据(有监督数据)和大量的未标注数据(无监督数据)来进行模型训练,从而在标注数据不足的情况下,提升模型的性能。 半监督学习…

coturn docker 项目 搭建【一切正常】

业务需求:需要coturn这个服务 定制语音视频连线 请参考"小红的逃脱外星人追踪计划" coturn项目 本地测试连接服务 turnutils_stunclient -p 3478 127.0.0.1turnutils_stunclient -p 3478 -L 127.0.0.1 127.0.0.1telnet localhost 3478turnutils_uclient …

WOFOST作物模型(3):(本地化校准)优化PCSE模型中的参数

目录 一、准备自己的LAI观测数据二、优化参数三、损失函数四、NLOPT优化五、优化结果可视化一、准备自己的LAI观测数据 在进行田间实测后,得到自己的LAI观测数据 在程序这个地方输入自己的LAI采样日期和观测值 二、优化参数 这里主要选择了TDWI(Total Dry Weight at ger…

Webpack学习笔记(6)

首先搭建一个基本的webpack环境: 执行npm init -y,创建pack.json,保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D,出现node_modules和package-lock.json。 1.source-Ma…

嵌入式开发中的机器人表情绘制

机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。 贴图效果相对比较好,在存储空间大的情况下是可以采用的。 自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果&…

表单元素(标签)有哪些?

HTML 中的表单元素&#xff08;标签&#xff09;用于收集用户输入的数据&#xff0c;常见的有以下几种&#xff1a; 文本输入框 <input type"text">&#xff1a;用于单行文本输入&#xff0c;如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…

探索CSDN博客数据:使用Python爬虫技术

探索CSDN博客数据&#xff1a;使用Python爬虫技术 在数字化的浪潮中&#xff0c;数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台&#xff0c;汇聚了海量的技术博客与文章&#xff0c;成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…

图像处理(大津法找阈值)

1.摄像头获取到一帧的图片&#xff1a; 2.将在图片中把赛道识别出来&#xff1a; 利用大津法将图片进行二值化&#xff0c;把大致赛道从图中区分出来&#xff1a; 3.对进行二值化之后的图像进行处理&#xff0c;将非赛道部分都进行补画&#xff0c;最后要得到一个明显的赛道图&…

vulnhub靶机driftingblues6

开启靶机 扫ip 扫目录 扫端口 访问扫到的ip 192.168.146.156 访问/robots.txt 有目录/textpattern/textpattern 提示不要忘记zip 访问 /textpattern/files目录是网站目录页面 访问目录/textpattern/textpattern 发现登陆页面 访问/textpattern/README 看到网站为Textpattern C…

Xilinx PCIe高速接口入门实战(三)

引言&#xff1a;为保证FPGA设备可以连接并被系统识别&#xff0c;本节讨论了PCIe基础规范和PCIe板卡电气规范的对FPGA配置时间具体要求。 1. 配置访问时间 在PCIe的标准系统中&#xff0c;当系统通电时&#xff0c;处理器上运行的配置软件开始扫描PCIe总线以发现机器拓扑。…

Linux:线程的概念

线程&#xff1a;进程内的一个执行分支&#xff0c;他的执行粒度比进程要细 一、通过进程引入线程 以前我们想要一个执行流&#xff0c;我们需要fork一个子进程&#xff0c;然后子进程需要拷贝 take_struct结构体进程地址空间页表文件描述符表…… 而当我们只创建一个task_st…

跟着逻辑先生学习FPGA-实战篇第二课 6-2 LED灯流水灯实验

** 硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad** 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 我们在《LED 灯…

Kafka数据迁移全解析:同集群和跨集群

文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景&#xff0c;分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景&#xff1a; broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践&#xff1a; 将需要新添加…

Ashy的考研游记

文章目录 摘要12.1112.2012.21 DAY1&#xff08;政治/英语&#xff09;政治英语 12.22 DAY2&#xff08;数学/专业课&#xff09;数学专业课 结束估分 摘要 在24年的12月里&#xff0c;Ashy完成了他的考研冲刺&#xff0c;顺利的结束了他本年度的考研之旅。 在十二月里&#…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中&#xff0c;还有一个流控效果选项&#xff1a; 流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&…

【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor

IJob&#xff1a;开启单个线程进行计算&#xff0c;线程内不允许对同一个数据进行操作&#xff0c;也就是如果你想用多个IJob分别计算&#xff0c;将其结果存储到同一个NativeArray<int>数组是不允许的&#xff0c;所以不要这样做&#xff0c;如下例子就是反面教材&#…

SELECT的使用

目录 1、SQL的查询命令 1.1 SELECT语句 1.2 投影查询 1.3 选择查询 1.4 聚合函数查询 1.5 简单分组查询(GROUP BY) 1.6 内连接查询 1.7 外连接查询 1.8 子查询 1. 无关子查询 2. 相关子查询 带exists的相关子查询&#xff1a; 1.9 集合查询 1. UNION(并) 2. INT…

电池均衡系统

一、电池概况 常见的电池分类&#xff1a;铅酸电池、锂电池、钠离子电池、碱性干电池、纽扣电池等&#xff0c;其中钠离子电池暂未大规模商用。 例如&#xff1a;电动车电池电压通常48v、60v、72v等&#xff0c;汽车启动电池电压&#xff1a;12v 而构成高电压的电池&#xf…

Windows系统下载、部署Node.js与npm环境的方法

本文介绍在Windows电脑中&#xff0c;下载、安装并配置Node.js环境与npm包管理工具的方法。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;其允许开发者使用JavaScript编写命令行工具和服务器端脚本。而npm&#xff08;Node Package Manager&#xff09;则…

使用arduino从零做一辆ROS2Jazzy的阿克曼小车---电机驱动篇

本项目采用 Arduino Mega2560 Pro 作为主控开发板&#xff0c;电机驱动器选用 TB6612FNG&#xff0c;并配备了 12V 电源、两个直流减速电机和一个舵机。未来计划通过嘉立创将各模块集成到一个 PCB 板上&#xff0c;提升系统的集成度和稳定性。 本文将聚焦于电机驱动部分&#x…