public boolean Lock(String key, Date date) {
String key1 = "lock:" + key;
long time = 5000L;
Boolean flag = false;
long maxTime = System.currentTimeMillis()+ DefaultMaxWaitTime;
for (; ; ) {
if (System.currentTimeMillis() > maxTime) {
throw new RuntimeException("系统繁忙");
}
redisTemplate.setKeySerializer(redisTemplate.getStringSerializer());
flag = redisTemplate.opsForValue().setIfAbsent(key1, date.toString() + Thread.currentThread().getId(), time, TimeUnit.MILLISECONDS);
if (flag&&(date.toString() + Thread.currentThread().getId()).equals(redisTemplate.opsForValue().get(key1))) {
break;
} else {
try {
Thread.sleep(new Random().nextInt(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (!flag){
throw new RuntimeException(Thread.currentThread().getId()+"异常跳出 当前锁为==>"+redisTemplate.opsForValue().get(key1)+"加锁内容为:==>"+date.toString() + Thread.currentThread().getId());
}
getWatchDog(key, date, String.valueOf(Thread.currentThread().getId()));
return flag;
}
public boolean UnLock(String key, Date date) {
String key1 = "lock:" + key;
System.out.println(Thread.currentThread().getId()+"释放锁");
if ((date.toString() + Thread.currentThread().getId()).equals(redisTemplate.opsForValue().get(key1))) {
redisTemplate.delete(key1);
return true;
}
throw new RuntimeException("解锁失败 请检查锁是否正确 === >" + date.toString() + Thread.currentThread().getId() + " " + redisTemplate.opsForValue().get(key1));
}
解锁的代码
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。