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():适用于你希望线程获取锁后一直执行任务,直到任务完成且显式释放锁的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Requests库01|使用Requests库发送 get/post/put/delete请求

学习目标: 能够使用Requests库发送 get/post/put/delete请求,获取响应状态码、数据能够使用UnitTest管理测试用例。 目录 一、Requests库安装和简介 二、设置http请求语法(重要) 三、应用案例(重要) …

[有用教程]从 Pixel 快速传输到 Android

概括 更换新手机很容易,但数据迁移却不容易。目前,用户喜欢转换品牌,应用市场上的转换工具也越来越多。然而,它们并不都是安全的。因此,选择一款简单、安全的迁移工具至关重要。 今天我们将讨论如何从 Pixel 转移到 …

【蓝桥杯研究生组】第15届Java试题答案整理

D 题 试题 D: 商品库存管理 时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分 【问题描述】 在库存管理系统中,跟踪和调节商品库存量是关键任务之一。小蓝经营的仓库中存有多种商品,这些商品根据类别和规格被有序地分类并编号,…

BUUCTF sqli-labs 1

这里就是单纯的找一下flag在哪,通关整个靶场在sql注入分区,虽然还没有通关。 这里要先看一下数据库都有哪些,用到语句:?id-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3-- 发现这个…

python实现自动登录12306抢票 -- selenium

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码,但是都不是最新的,我也是从网上找别人的帖子,看B站视频&…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

[微服务] - MQ高级

在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时,如何考虑时区转换问题? 2. Blob和text有什么区别? 3. mysql里记录货币用什么字段类型比较好? 4. MySQL如何获取当前日期? 5. 你们数据库是否支持emoji表情存储…

aws(学习笔记第二十一课) 开发lambda应用程序

aws(学习笔记第二十一课) 开发lambda应用程序 学习内容: lambda的整体概念开发lambda应用程序 1. lambda的整体概念 借助AWS Lambda,无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda,可以为几乎任何类型的应用进…

【优选算法】查找总价格为目标值的两个商品

链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;利用单调性&#xff0c;使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…

VUE echarts 教程二 折线堆叠图

VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…

2024年中国新能源汽车用车发展怎么样 PaperGPT(二)

用车趋势深入分析 接上文&#xff0c;2024年中国新能源汽车用车发展怎么样 PaperGPT&#xff08;一&#xff09;-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程&#xff1a;2024年纯电车辆月均行驶超过1500公里&…

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…

yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)

高级前端加解密与验签实战 一、前端验证签名&#xff08;验签&#xff09;表单&#xff1a;HMAC-SHA256 使用hmac-sha256的十六进制key值可以加密 与页面加密后的值相同 热加载&#xff1a; encryptData func(p) { //sha256key值key codec.DecodeHex("313233343132333…

嵌入式入门Day35

网络编程 Day2 套接字socket基于TCP通信的流程服务器端客户端TCP通信API 基于UDP通信的流程服务器端客户端 作业 套接字socket socket套接字本质是一个特殊的文件&#xff0c;在原始的Linux中&#xff0c;它和管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号等…

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序&#xff0c;在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中&#xff0c;并逐个提供给接收服务。通过以这种方式解耦服务&#xff0c;你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…

分布式系统架构6:链路追踪

这是小卷对分布式系统架构学习的第6篇文章&#xff0c;关于链路追踪&#xff0c;之前写过traceId的相关内容&#xff1a;https://juejin.cn/post/7135611432808218661&#xff0c;不过之前写的太浅了&#xff0c;且不成系统&#xff0c;只是简单的理解&#xff0c;今天来捋一下…