基于Redis的Java分布式可重入锁对象,实现了锁接口。
如果获得锁的Redisson实例崩溃,那么这种锁可能永远挂起在获得状态。为了避免这种情况,Redisson维护了锁看门狗,它在锁持有者Redisson实例活着的时候延长锁过期时间。默认情况下,看门狗的超时时间为30秒,可以通过配置进行修改。lockWatchdogTimeout设置。
可以定义锁获取期间的leaseTime参数。在设定的时间间隔后,锁自动释放。
RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程可以解锁它,否则将抛出IllegalMonitorStateException。否则考虑使用RSemaphore对象。
总结下来就是
- //获取锁对象
- RLock lock = redisson.getLock("myLock");
-
- //传统加锁方法
- lock.lock();
-
- //或者获得锁并在10秒后自动解锁
- lock.lock(10, TimeUnit.SECONDS);
-
- //加锁阻塞等待时间100秒,且获得锁10秒后自动释放锁
- boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
- if (res) {
- try {
- ...
- } finally {
- lock.unlock();
- }
- }
- /**
- * 获取锁
- * @param lockName
- * @return
- */
- public static RLock getLock(String lockName){
- RLock rLock = redissonClient.getLock(lockName);
- if(rLock.isLocked()){
- return null;
- }
- rLock.lock(default_lease_time, TimeUnit.SECONDS);
- return rLock;
- }
-
-
- /**
- * 获取锁
- * @param lockName
- * @param waitTime 阻塞时间(秒)
- * @return
- */
- public static RLock getLock(String lockName, long waitTime){
- RLock rLock = redissonClient.getLock(lockName);
- try {
- boolean resp = rLock.tryLock(waitTime, default_lease_time,TimeUnit.SECONDS);
- if(resp){
- return rLock;
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * 释放锁
- * @param lock
- */
- public static void unlock(RLock lock){
- if(ObjectUtils.isEmpty(lock)){
- return;
- }
- if(!lock.isLocked()){
- return;
- }
- lock.unlock();
- }
除此,官网还有其他几个所对想,具体参考redisson
