redissonredlock_redisson lock

redissonredlock_redisson lock1.现在错误的用法:RLocklock=redisson.getLock(String.format(LOCK_KEY,2));try{if(lock.tryLock()){//处理logger.info(“aaaaaaaaaaaaaaaaaa”);}catch(Exceptione){//处理异常}finally{…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181741.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python和java哪个更值得学_java和python「建议收藏」

    python和java哪个更值得学_java和python「建议收藏」从去年到现在IA人工智能热度一直都是上升,而且很多有经验的程序员也打出“2018年不学习Python还能学习哪种编程语言“的口号,可对于初学者来说,Python相对比较简单。Python的语法类似于伪

    2022年7月5日
    23
  • GBDT算法原理_描述算法的工具

    GBDT算法原理_描述算法的工具一.前言在AdaBoost基本原理与算法描述中,我们介绍了AdaBoost的基本原理,本篇博客将介绍boosting系列算法中的另一个代表算法GBDT(GradientBoostingDecisionTree,梯度提升树)算法。这里对GBDT的学习做一个总结,也希望对有帮助的同学能有一个帮助。在介绍AdaBoost的时候我们讲到了,AdaBoost算法是模型为加法模型,损失函数为指…

    2022年10月12日
    0
  • python中读写LMDB数据库[通俗易懂]

    python中读写LMDB数据库[通俗易懂]转自原文:https://blog.csdn.net/dcrmg/article/details/79144507LMDB的全称是LightningMemory-MappedDatabase(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件:LMDB文件可以同时由多个进程打开,具有极高的数据存取速度,访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码…

    2022年9月29日
    0
  • C# 退出对话框 DialogResult 用法

    C# 退出对话框 DialogResult 用法下面的代码可以防止对话框弹出二次的尴尬。\///<summary>///点击关闭后,停止程序///</summary>///<paramname=”sender”></param>///<paramname=”e”></param>…

    2022年6月22日
    22
  • httprunner(3)用脚手架快速搭建项目[通俗易懂]

    httprunner(3)用脚手架快速搭建项目[通俗易懂]前言如何快速搭建一个httprunner项目呢?我们可以使用脚手架,脚手架就是自动地创建一些目录,形成一个项目的架构,不需要我们再手动的去创建查看创建新项目的命令先来查看一下帮助命令httpr

    2022年7月29日
    6
  • html中div加滚动条

    html中div加滚动条div加滚动条的两种方法:一、<divstyle=”overflow:scroll;width:400px;height:400px;”></div>记住宽和高一定要设置噢,否则不成的不过在不超出时,会有下面的滚动条,所以不是最好的选择二、<divstyle=”overflow-y:auto;overflow-x:auto;…

    2022年7月12日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号