场景:
假如线程A获取分布式锁进入方法A,由于某种原因Hang住了 到了指定时间释放锁,这个时候线程B进入得到锁,这个时候线程B很顺利完成业务逻辑操作,然后释放掉锁,就在这个时候线程A开始继续往下执行代码,按照这个逻辑他最终会执行finally代码块 执行到释放锁的逻辑
那么这个时候如果锁的值一样,很有可能会释放掉已经获取锁的线程持有的那把锁。
那么该如何设计呢?
答案很简单,可以把锁的值设为UUID,保证唯一,这样每个线程的锁的值都是不一样的!

我们释放REDIS的锁 是通过执行LUA脚本实现的
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end

  



调用的时候,锁的值是UUID的值。那为什么要设计为UUID的值,而不是随便来一个值呢?
String lockVal = UUID.randomUUID().toString();

public boolean unlock(String lockName, String lockVal) {
log.info("释放redis锁 {}", lockVal); Object eval = redisTemplate.execute(unlockLuaScript, Lists.newArrayList(lockName), lockVal);
if (eval != null) {
ArrayList<Long> evalArr = (ArrayList<Long>) eval;
boolean b = evalArr.get(0) == 1;
if (b) {
log.info("释放redis锁成功 {}", lockVal);
return true;
}
}
log.error("释放redis锁超时 {}", lockVal);
return false;
}

上面这段代码解释了为什么redis锁的值要设计成为UUID的uuid形式  因为假如redis业务逻辑时间执行的比较长,可能导致超时释放锁,那么另一线程获取锁,其执行完相关业务代码后,释放了锁。然后上一个线程执行完逻辑后,继续执行 (这个时候它是无锁的状态)但还是会去释放锁因为finally代码会最终执行!

最新文章

  1. 会游走的TextView
  2. Object.create()方法的低版本兼容问题
  3. 《java JDK7 学习笔记》课后练习题3
  4. HPCC 登录总结
  5. MSP430F149学习之路——比较器Comparaor_A
  6. 【LeetCode】100 - Same Tree
  7. linux命令之cat
  8. 《Linux多线程服务器端编程》读书笔记第3章
  9. BZOJ 3368 约翰看山(扫描)O(N)
  10. 理解volatile
  11. 【JAVAWEB学习笔记】27_Redis:在Linux上的安装、Jedis和常用命令
  12. objective-c如何在linux下进入Modern模式
  13. Linux 调试打印时间和颜色
  14. jmeter 之beanshell preprocessor
  15. 创作型---原型模式(C# ICloneable接口的实现)
  16. PHP生成器细说
  17. 使用Spring配置数据源JdbcTemplate
  18. 修改VCL源码实现自定义输入对话框
  19. curator 实现分布式一致性锁
  20. Datagrid分页、排序、删除代码

热门文章

  1. java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal报错处理
  2. fedora之自动寻找命令并提示安装PackageKit-command-not-found
  3. 震撼,java面试题整合(良心制作)11万多字拿去。持续更新【可以收藏】
  4. 【操作系统】Linux bash常用函数路径配置
  5. 【操作系统】bat文件 系统找不到文件路径
  6. 使用 JavaScript 用循环嵌套输出乘法表。外循环控制行数,内循环控制当前行要输出的乘法表达式,在页面上输出九九乘法表
  7. 云南农职 - 互联网技术学院 - 美和易思大一SCME JAVA高级结业考试机试试题
  8. Oracle 系统函数
  9. vue3.0 没有 vue.condig.js 解决
  10. [Docker] 在CentOS6.8 安装 Docker