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爬虫爬取网页信息_爬虫python

    用python爬虫爬取网页信息_爬虫python【一、项目背景】[蜜柑计划-MikanProject]:新一代的动漫下载站。是一个专门为喜欢动漫的小伙伴们打造的动漫视频在线播放网站,为大家第一时间分享最新动漫资源,每日精选最优质的动漫推荐。【二、项目目标】实现获取动漫种子链接,并下载保存在文档。【三、涉及的库和网站】1、网址如下:https://mikanani.me/Home/Classic/{}2、涉及的库:reques**ts、lxml、fake_useragent**3、软件:PyCharm【四、项目分析】…

    2022年10月21日
    2
  • CPU流水线详解_多周期流水线cpu

    CPU流水线详解_多周期流水线cpu为什么Intel处理器主频这么高,而AMD处理器主频都很低?是不是AMD处理器性能不如Intel?我们一般的回答都是,因为Intel处理器与AMD处理器内部构架不同,所以导致了这种情况,还有一种具体一点的回答就是因为Intel处理器流水线长,那到底流水线与CPU主频具体有什么关系呢?今天给大家带来一篇我以前刊登在《电脑报》硬件板块技术大讲堂版面的一篇原创文章。关于CPU流水线的知识,很多报纸杂

    2022年8月20日
    22
  • pycharm上方的运行栏隐藏了_pycharm工具栏怎么调出来

    pycharm上方的运行栏隐藏了_pycharm工具栏怎么调出来pycharm顶部菜单栏不见,两种处理方法,处女座福音方法一:踩坑搜索,全网都是这样的:双击Shift键盘,点击Actions,搜索view,找到MainMenu,打开,ok方法二:曲线救国我找了半天,发现能进设置界面,随便点一个进入设置点击快捷键,将主菜单设置一个快捷键,这里我设置的W+W设置完成,应用界面上双击WW,就出现了主菜单,再把主菜单打开,完美。。…

    2022年8月27日
    14
  • linux如何批量关闭进程

    linux如何批量关闭进程

    2021年11月27日
    84
  • sed提取两个关键字之间的内容_python提取文本指定内容

    sed提取两个关键字之间的内容_python提取文本指定内容示例:<table> <thead> <tr> <th>ID</th> <th>名称</th> <th>电话</th> <th>说明</th> <th>类型</th> <th&g…

    2025年9月25日
    4
  • datagrap激活码_通用破解码

    datagrap激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    46

发表回复

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

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