美文网首页
RedissonClient 锁的使用

RedissonClient 锁的使用

作者: 一滴矿泉水 | 来源:发表于2023-11-17 14:55 被阅读0次

RedissonClient是一个基于Redis的分布式锁实现,它提供了许多高级分布式锁功能,如分布式锁、分布式信号量、分布式读写锁等。以下是RedissonClient的常用锁方法介绍:

  • lock():加锁,如果锁不存在则创建,如果存在则获取该锁。
  • lock(long var1, TimeUnit var3):加锁,如果锁不存在则创建,如果存在则获取该锁。如果获取锁后持有时间超过 var1 设定时间则释放锁。
  • tryLock():尝试获取锁,如果锁已经被占用,则立即返回false。
  • tryLock(timeout, timeunit):尝试获取锁,如果锁已经被占用,则等待指定的时间,直到锁被释放或超过指定的等待时间,超时则返回 返回false 。
  • lockInterruptibly():尝试获取锁,如果当前线程未被中断,则成功获取到;如果当前线程被中断,则抛出InterruptedException。这个方法允许我们在获取锁时处理中断情况,以保证程序的健壮性和正确性。
  • lockInterruptibly(long var1, TimeUnit var3):尝试获取锁,如果当前线程未被中断,则成功获取到;如果当前线程被中断,则抛出InterruptedException,如果获取锁后持有时间超过 var1 设定时间则释放锁。
  • unlock():解锁,释放持有的锁。
  • unlock(key):释放指定的锁。
  • isLocked():查询当前锁是否被锁定。
  • isHeldByCurrentThread():

这些方法可以帮助你在分布式系统中实现同步访问共享资源的机制,确保数据一致性和并发问题的解决。

锁的使用

lock() 与 lockInterruptibly() 方法的使用

    RLock lock = redissonClient.getLock("lock_key");
    try {
        // 上锁
        lock.lock();
        //lock.lockInterruptibly();

        System.out.println("开始进入业务代码--->当前线程--->"+Thread.currentThread().getId());
        //业务代码
        Thread.sleep(6000);
        System.out.println("业务代码执行完毕--->当前线程--->" + Thread.currentThread().getId());
    } catch (InterruptedException e){
        System.out.println("IllegalStateException 错误--->"+ e +"--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception 错误--->" + e + "--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } finally {
        lock.unlock();
        System.out.println("解锁 成功--->当前线程--->" + Thread.currentThread().getId());
    }

lock.lock(-1L, TimeUnit.SECONDS) 与 lock.lockInterruptibly(5,TimeUnit.SECONDS) 方法的使用

    RLock lock = redissonClient.getLock("lock_key");
    try {
        // 上锁
        lock.lock(5, TimeUnit.SECONDS);
        //lock.lockInterruptibly(5,TimeUnit.SECONDS);
        
        System.out.println("开始进入业务代码--->当前线程--->"+Thread.currentThread().getId());
        //业务代码
        Thread.sleep(6000);
        System.out.println("业务代码执行完毕--->当前线程--->" + Thread.currentThread().getId());
    } catch (InterruptedException e){
        System.out.println("IllegalStateException 错误--->"+ e +"--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception 错误--->" + e + "--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } finally {
        if (lock.isHeldByCurrentThread() && lock.isLocked()){
            lock.unlock();
            System.out.println("解锁 成功--->当前线程--->" + Thread.currentThread().getId())
        }
    }

lock.tryLock() 与 lock.tryLock(5, TimeUnit.SECONDS) 方法的使用

    RLock lock = redissonClient.getLock("lock_key");
    try {
        // 上锁
        boolean b = lock.tryLock();
        //boolean b = lock.tryLock(5, TimeUnit.SECONDS);
        if (!b){
            System.out.println("获取锁不成功--->当前线程--->"+Thread.currentThread().getId());
            // 此处抛出异常 活业务处理
            return;
        }
        System.out.println("开始进入业务代码--->当前线程--->"+Thread.currentThread().getId());
        //业务代码
        Thread.sleep(6000);
        System.out.println("业务代码执行完毕--->当前线程--->" + Thread.currentThread().getId());
    } catch (InterruptedException e){
        System.out.println("IllegalStateException 错误--->"+ e +"--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception 错误--->" + e + "--->当前线程--->" + Thread.currentThread().getId());
        e.printStackTrace();
    } finally {
        lock.unlock();
        System.out.println("解锁 成功--->当前线程--->" + Thread.currentThread().getId());
    }

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习 !

相关文章

网友评论

      本文标题:RedissonClient 锁的使用

      本文链接:https://www.haomeiwen.com/subject/pecywdtx.html