首页 > 数据库 >redisson lock的使用

redisson lock的使用

时间:2023-04-20 18:44:09浏览次数:49  
标签:redisson Thread lock --- RedissonLock 使用 org

1.现在错误的用法:

RLock lock = redisson.getLock(String.format(LOCK_KEY, 2));
try {
if (lock.tryLock()) {
//处理
logger.info("aaaaaaaaaaaaaaaaaa");
} catch(Exception e) {
//处理异常
} finally {
if (lock.isLocked()) {
lock.unlock();
}
}
测试实例:
TwoThread.java

public class TwoThread implements Runnable {
private RedissonClient redisson;

public TwoThread(RedissonClient redisson) {
this.redisson = redisson;
}

private Logger logger = LogManager.getLogger(getClass());
private String REWARD_CARD_LOCK_KEY = "444:lock:%d";

public void run() {
RLock lock = redisson.getLock(String.format(REWARD_CARD_LOCK_KEY, 2));
logger.info("thread---{}, lock:{}",Thread.currentThread().getId(), lock);
try {
if (lock.tryLock()) {
logger.info("tryLock thread---{}, lock:{}",Thread.currentThread().getId(),lock);
logger.info("aaaaaaaaaaaaaaaaaa");
}
} finally {
boolean locked = lock.isLocked();
logger.info("thread---{},lock:{},locked:{}",Thread.currentThread().getId(),lock,locked);
if (locked) {
logger.info("thread unlock---{}, lock:{}",Thread.currentThread().getId(),lock);
lock.unlock();
}

}
}
测试类:

Thread one = new Thread(new TwoThread(redisson));
Thread two = new Thread(new TwoThread(redisson));
Thread three = new Thread(new TwoThread(redisson));
Thread four = new Thread(new TwoThread(redisson));
one.start();
two.start();
three.start();
four.start();
打印结果:

thread---111, lock:org.redisson.RedissonLock@1cb2393f
thread---112, lock:org.redisson.RedissonLock@70feb82b
thread---114, lock:org.redisson.RedissonLock@50384a5d
thread---113, lock:org.redisson.RedissonLock@42232129
thread---111,lock:org.redisson.RedissonLock@1cb2393f,locked:true
aaaaaaaaaaaaaaaaaa
thread---113,lock:org.redisson.RedissonLock@42232129,locked:true
thread---112,lock:org.redisson.RedissonLock@70feb82b,locked:true
thread unlock---111, lock:org.redisson.RedissonLock@1cb2393f
thread---114,lock:org.redisson.RedissonLock@50384a5d,locked:true
thread unlock---114, lock:org.redisson.RedissonLock@50384a5d
thread unlock---113, lock:org.redisson.RedissonLock@42232129
thread unlock---112, lock:org.redisson.RedissonLock@70feb82b
Exception in thread "Thread-20" Exception in thread "Thread-19" java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 54882863-3389-40e7-ba4d-58ecae0a7155 thread-id: 114
at org.redisson.RedissonLock.unlock(RedissonLock.java:367)
at xx.TwoThread.run(TwoThread.java:36)
at java.lang.Thread.run(Thread.java:745)
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 54882863-3389-40e7-ba4d-58ecae0a7155 thread-id: 113
at org.redisson.RedissonLock.unlock(RedissonLock.java:367)
at xx.TwoThread.run(TwoThread.java:36)
at java.lang.Thread.run(Thread.java:745)
尝试去解锁,但是没有被当前线程锁住。

boolean locked = lock.isLocked()为什么一直返回true,查看源码,只要这个锁被任意一个线程锁,就会返回true

/**
* Checks if this lock locked by any thread
*
* @return <code>true</code> if locked otherwise <code>false</code>
*/
boolean isLocked();
所以,在finally里面 没有被锁就解锁,肯定会报错的。

2.tryLock正确用法:

RLock lock = redisson.getLock(String.format(REWARD_CARD_LOCK_KEY, 2));
try {
//尝试加锁,最多等待10秒,上锁以后10秒自动解锁
if (lock.tryLock(10,10, TimeUnit.SECONDS)) {
try {
//处理
logger.info("tryLock thread---{}, lock:{}", Thread.currentThread().getId(), lock);
} catch (Exception e) {
} finally {
//解锁
lock.unlock();
}
}
} catch (InterruptedException e) {
//处理
//保留中断发生的证据,以便调用栈中更高层的代码能知道中断,并对中断作出响应
Thread.currentThread().interrupt();
}
关于处理InterruptedException,文档参考:

https://www.ibm.com/developerworks/cn/java/j-jtp05236.html

需要恢复中断状态场景的一个例子,方便理解:

https://www.cnblogs.com/softidea/p/4413374.html
————————————————
版权声明:本文为CSDN博主「qq_24664619」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24664619/article/details/103879692

标签:redisson,Thread,lock,---,RedissonLock,使用,org
From: https://www.cnblogs.com/zhangshiwen/p/17337930.html

相关文章

  • hive 使用JDBC访问 和启动远程端口
      0:hiveservice开启远程访问端口: hive使用jdbc进行访问,要求我们必须开启远程可以访问的端口,其中端口11000是随机的,可以是10002或者别的端口,这设定好好java代码链接时候就要使用开启好的端口。  linuxshell下执行hive--servicehiveserver-p11000>/dev/null2>&1......
  • git 的基本使用
    学习系列,git基本命令记录,开始之前,看下git的工作原理图:基础命令gitinit#创建本地仓库gitstatus#查看信息gitadd文件名(*)#将代码提交至暂存区gitcommit-m'备注信息'#将代码提交到本地仓库gitdiff文件名#对比文件信息gitlog(--p......
  • CentOS7使用systemctl添加自定义服务
    一、简介Centos7开机第一个程序从init完全换成了systemd这种启动方式,同centos56已经是实质差别。systemd是靠管理unit的方式来控制开机服务,开机级别等功能。在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关......
  • LeetCode-Go:一个使用 Go 语言题解 LeetCode 的开源项目
    在中国的IT环境里,大多数场景下,学习算法的目的在于通过笔试算法题。但算法书林林总总,有时候乱花渐欲迷人眼。杜甫有诗云:读书破万卷,下笔如有神。不管选择哪本书,只要深入学习,分层次,逐层进阶,一定可以将算法攻克。笔者强烈推荐一个Github开源项目LeetCode-Go,你不仅可以把他当做......
  • docker-compose 安装使用教程
    1、下载二进制文件:curl-Lhttps://github.com/docker/compose/releases/download/v2.17.1/docker-compose-linux-x86_64  -o/usr/local/bin/docker-compose2、授权执行权限:    chmod+x/usr/local/bin/docker-compose3、查看版本:  docker-compose--version......
  • pytorch训练可视化包visdom的使用
    visdom的使用一、简介二、安装与启动三、设计思路四、在迭代训练中的绘图五、一般绘图六、基本调整与保存文件1、`调整大小、拖拽`:长按拖动即可,右下角落长按移动即可放大缩小2、`查看图片对应的数据`:点击右下角`Edit`,会跳转到新网页,可以灵活进行数据调整3、`图内控件调整`:比如,放大......
  • Python操作Neo4j数据库使用案例
    Python操作Neo4j数据库使用案例一、数据结构二、上传数据三、清空数据库项目数据和代码  Neo4j是一个世界领先的开源的基于图的数据库。其语言操作简单直观,本文假设你已经安装好Neo4j数据库,并对知识图谱有一定的了解。Neo4j数据库的查询语言为CQL,其代表Cypher查询语言。像Orac......
  • AutoGPT安装及使用
    AutoGPT简介AutoGPT是一个实验性开源应用程序,展示了GPT-4语言模型的功能。该程序由GPT-4驱动,将LLM“思想”链接在一起,以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一,AutoGPT突破了人工智能的极限。注:AutoGPT也可以使用GPT-3.5运行。Auto-GPT英文官方网站......
  • Go中使用JWT
    原文链接:https://blog.csdn.net/m0_58121644/article/details/129643351JWT(JSONWebTokens)是一种基于JSON格式的轻量级身份验证和授权方案。在Go项目中使用JWT,一般需要完成以下步骤:1.安装JWT库在Go项目中使用JWT需要先安装JWT库,可以使用以下命令安装:gog......
  • node.js使用Nodemailer发送邮件
    引言--常常看到一些网站有邮箱获取验证码验证注册或者修改密码等,今天也来了解一下在nodejs+express怎么发送电子邮件。使用模块Nodemailer。这里以qq邮箱举例子。安装模块--npminstallNodemailer--save创建一个SMTP客户端配置--//引入模块nodemailerconstnodemai......