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.mzph.cn/web/64715.shtml

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

相关文章

【git】git生成rsa公钥的方法

git生成rsa公钥的方法 一,简介二,操作方法三,总结 一,简介 在工作的过程中,经常需要生成rsa的密钥,然后提供给别人,然后别人给你开通代码下载权限。本文介绍如何在本地生成rsa的密钥供参考。 …

Zookeeper模式安装Kafka(含常规、容器两种安装方式)

一、#创作灵感# 公司使用Kafka的软件项目较多,故写技术笔记巩固知识要点 二、软件环境 - Kafka 3.9.0 官方下载地址:Kafka 3.9.0 - ZooKeeper 3.9.3 官方下载地址:ZooKeeper 3.9.3 - Docker Desktop 4.37 容器图形化工具 官方下载地址…

7.傅里叶级数练习题

7.傅里叶级数练习题 设函数&#xff1a; f ( x ) { − x , 0 ≤ x ≤ 1 2 , 2 − 2 x , 1 2 < x < 1 , f(x) \begin{cases} -x, & 0 \leq x \leq \frac{1}{2}, \\ 2 - 2x, & \frac{1}{2} < x < 1, \end{cases} f(x){−x,2−2x,​0≤x≤21​,21​<x&…

【高项】信息系统项目管理师(二)项目管理概论

一、PMBOK的发展 项目管理知识体系&#xff08;PMBOK&#xff09;是由美国项目管理协会&#xff08;PMI&#xff09;开发的一套描述项目管理专业范围的知识体系&#xff0c;包含了对项目管理所需的知识、技能和工具的描述。 二、项目基本要素 2.1 项目基础 项目是为提供一项…

C++设计模式:状态模式(自动售货机)

什么是状态模式&#xff1f; 状态模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时&#xff0c;动态改变其行为。通过将状态相关的逻辑封装到独立的类中&#xff0c;状态模式能够将状态管理与行为解耦&#xff0c;从而让系统更加灵活和可维护。 通…

【Pytorch实用教程】循环神经网络中使用dropout需要注意的问题

文章目录 问题解答警告的具体含义解决方案示例代码总结问题 UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.3 and num_layers=1 warnings.warn("dropout op…

数据中台与数据治理服务方案[50页PPT]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心&#xff0c;通过整合各部门业务系统数据&#xff0c;进行建模与加工&#xff0c;以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题&#xff0c;确保数据…

postgresq-自定义执行计划(custom plan)与generic plan(通用执行计划)

文章目录 之前写过一篇关于 PostgreSQL prepare sql的文章&#xff0c;但当时没有提到generic plan(通用计划)和custom plan(自定义计划)这两个概念。现在将通过举例介绍这两个概念。 创建测试表&#xff1a; postgres# create database demo; CREATE DATABASE postgres# \c d…

dockfile 配置 /etc/apt/source.list.d/debian.list 清华镜像

docker:3.12.7 镜像使用的是 debian 系统&#xff0c;比 ubuntu 更轻量。debian 系统内&#xff0c;apt 镜像源列表位于 /etc/apt/source.list.d/debian.list&#xff08;作为对比&#xff0c;ubuntu 的镜像列表位于 /etc/apt/source.list&#xff0c;二者语法相同&#xff09;…

程序员测试日常小工具

作为一名程序员&#xff0c;或者测试人员&#xff0c;日常工作最常用的工具有哪些&#xff0c;截图&#xff0c;截图漂浮&#xff0c;翻译&#xff0c;日期处理&#xff0c;api调用...&#xff0c; 当你拿到一串报文后&#xff0c;想要json转换时&#xff0c;是不是要打…

【MySQL高级】第1-4章

第1章 存储过程 1.1 什么是存储过程&#xff1f; 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。 换…

深入浅出:AWT事件监听器及其应用

前言 在Java的GUI编程中&#xff0c;事件处理是非常重要的一环。AWT&#xff08;Abstract Window Toolkit&#xff09;框架提供了灵活的事件处理机制&#xff0c;使得开发者能够响应用户的操作&#xff0c;例如点击按钮、键盘输入、鼠标点击等。AWT的事件监听器就是实现这一机…

【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问

8.5.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…

混合合并两个pdf文件

混合两个pdf 1、在线免费交替和混合奇数和偶数PDF页面2、有什么软件把两个 PDF 交叉合并&#xff1f;3、pdfsam本地合并 如何Google翻译的原文和译文合并&#xff0c;&#xff08;沉浸式翻译效果相对较好&#xff09; 1、在线免费交替和混合奇数和偶数PDF页面 https://deftpd…

Hutool 发送 HTTP 请求的几种常见写法

最简单的 GET 请求&#xff1a; String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求&#xff1a; // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…

获取用户详细信息-ThreadLocal优化

Thread全局接口可用&#xff0c;不用再重复编写。所以为了代码的复用&#xff0c;使用Thread。把之前的内容&#xff08;函数的参数和map与username&#xff09;注释掉&#xff0c;换为Thread传过来的内容&#xff08;map与username&#xff09;。 因为Thread需要在拦截器里面…

THUCNews解压/THUCNews数据集解压出问题

省流&#xff1a;使用zip64进行解压&#xff0c;文件数目太多windows默认zip16装不下 我在使用THUCNews中文文本数据集时出现了问题&#xff0c;原数据集解压后应该包含以下两个文件夹: 其中THUCNews文件夹下有以新闻类别命名的子文件。官网下载的是一个1.56GB的zip压缩包 而我…

MySQL使用通用二进制文件安装到Unix/Linux

Oracle提供了一组MySQL的二进制发行版。其中包括用于许多平台的压缩tar文件&#xff08;扩展名为.tar.xz的文件&#xff09;形式的通用二进制发行版&#xff0c;以及用于选定平台的特定平台包格式的二进制文件。 本节介绍在Unix/Linux平台上从压缩的tar文件二进制分布安装MySQ…

安卓/system/bin下命令中文说明(AI)

ATFWD-daemon&#xff1a;AT指令转发守护进程&#xff0c;用于将AT指令从应用层转发到调制解调器。 PktRspTest&#xff1a;数据包响应测试工具。 StoreKeybox&#xff1a;存储密钥盒工具&#xff0c;用于安全地存储加密密钥。 WifiLogger_app&#xff1a;WiFi日志记录应用&…

Git操作总结

可以直接看实践 总结自施磊老师课程 Git与SVN对比 svn操作流程 写代码。 从服务器拉回服务器的当前版本库&#xff0c;并解决服务器版本库与本地代码的冲突。 将本地代码提交到服务器。 Git操作流程 写代码&#xff0c; 然后添加&#xff08;add&#xff09;到暂存区。 …