【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
后期出, springboot2 整合redis-此次仅记录redis的坑;
代码: 测试锁的自动释放与延迟间隔
public void t0() throws InterruptedException { String key = "seckill-order-submit-lock-1"; int i= 0; while(true){ i++; System.out.println(i+"--------------------------,每一次的执行都说明获取锁失败"); Boolean flag = RedisLockUtil.tryLock(key,3,2); if(flag){ System.out.println(i+"执行业务逻辑----------------"); System.out.println("获取锁成功, 但故意不释放, 后面的人是否可以获得锁"); Thread.sleep(6000); } } }
package org.linlinjava.litemall.db.util;
/**
* @Description:
* @Auther: wuxw
* @Date: 2019/12/18 18:10
*/
import org.linlinjava.litemall.db.service.DistributedLocker;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;
/**
* redis分布式锁帮助类
* @author yangzhilong
*
*/
@Component
public class RedisLockUtil {
@Autowired
private DistributedLocker locker;
private static DistributedLocker distributedLocker;
@PostConstruct
private void init() {
distributedLocker = locker;
}
/**
* 加锁
* @param lockKey
* @return
*/
public static RLock lock(String lockKey) {
return distributedLocker.lock(lockKey);
}
/**
* 释放锁
* @param lockKey
*/
public static void unlock(String lockKey) {
distributedLocker.unlock(lockKey);
}
/**
* 释放锁
* @param lock
*/
public static void unlock(RLock lock) {
distributedLocker.unlock(lock);
}
/**
* 带超时的锁
* @param lockKey
* @param timeout 超时时间(上锁后自动释放锁时间) 单位:秒
*/
public static RLock lock(String lockKey, int timeout) {
return distributedLocker.lock(lockKey, timeout);
}
/**
* 带超时的锁
* @param lockKey
* @param unit 时间单位
* @param timeout 超时时间(上锁后自动释放锁时间)
*/
public static RLock lock(String lockKey, int timeout, TimeUnit unit ) {
return distributedLocker.lock(lockKey, unit, timeout);
}
/**
* 尝试获取锁
* @param lockKey
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @return
*/
public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
return distributedLocker.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime);
}
/**
* 尝试获取锁
* @param lockKey
* @param unit 时间单位
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @return
*/
public static boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
return distributedLocker.tryLock(lockKey, unit, waitTime, leaseTime);
}
}
redis lock的几个方法
/** * 加锁 * @param lockKey * @return */ public static RLock lock(String lockKey) { return distributedLocker.lock(lockKey); }
一旦获取, 永不释放, 不手动调用unlock ,则永远不释放
/** * 带超时的锁 * @param lockKey * @param timeout 超时时间(锁的持续生存时间) 单位:秒 */ public static RLock lock(String lockKey, int timeout) { return distributedLocker.lock(lockKey, timeout); }
一旦获取, 永不释放, 不手动调用unlock ,则永远不释放; 虽然设置了时间, 但你没有获取到也是很难受啊 一直等待获取;卡死, 容易死锁
/** * 尝试获取锁 * @param lockKey * @param waitTime 最多等待时间 * @param leaseTime 上锁后自动释放锁时间 * @return */ public static boolean tryLock(String lockKey, int waitTime, int leaseTime) { return distributedLocker.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime); }
尝试, 尝了waitTime 后, 心灰意冷, 不等了, 就是这么任性;,继续执行后续代码
千万要谨记: 获取,锁失败, 可别主动去unlock
更多观看:
https://blog.csdn.net/qq_42105629/article/details/102589319
来源:oschina
链接:https://my.oschina.net/java1314/blog/3144638