1.先去redis中使用 setnx key value
2.发现redis里头有数据,说明已经加锁了
3.发现redis里头没有数据,说明可以获得锁
4.使用redis del key
5.锁超时 java 调用redis expire设置超时时间,自动删除key
三大致命问题:
1)非原子性操作
setex 宕机了 expire用不了
解决思路:set(key,value,exprie)是原子性操作 redis2.6版本以上才支持
2)误删锁
set(key,value,30),在30秒时间内,程序未操作完成,锁删了
解决思路:删除锁之前,先判断是不是自己的锁;set(key,value,exprie)让velue为线程id
3)基于第二个问题之上
jvm1判断是否处理完成,jvm1处理完数据后才能释放锁,jvm1增加守护线程;
补充: 在没有获取到锁的情况下,提示获取锁失败
守护线程小知识:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。