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());
}
文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习 !
网友评论