记录Redisson可重入锁的个人见解。
文章目录
前言
之前在写项目的时候,注意到Redisson可重入锁的一个问题,随即在网上搜索其对应的资料,下面就记录一下个人的看法。
这里简单介绍一下Redisson,Redisson:通俗来讲它是一个在Redis基础上实现的一个分布式工具的集合,也就是说在分布式系统下,要用到的各种各样的工具它都有,包括分布式锁!!!
一、什么叫做锁的重入?
⚠️⚠️⚠️ 一个线程里面2次去获取锁,这个就是锁的重入!
典型的就是:一个方法里面包含获取锁,而这个方法又去调用另外一个方法,被调用的这个方法他里面也要去获取锁 。
这里举一个例子!下面看一下,我们之前自己定义的锁,能不能去实现锁的重入!!!
上图显然不能实现!!! 牵涉到多次调用同一把锁,可能会形成死锁现象。
二、Redisson可重入锁原理
这个时候我们想到一种办法,那就是:当我们去获取锁的时候,采用hash数据结构存储,不仅仅存储线程标识,还要存储可重入的次数(核心) 。结构如下图一样!!!
上面这一句话要理解,他的其实现的思想就是如此。
⚡⚡⚡ 具体执行原理:当我们去获取锁的时候,采用hash结构,不仅仅存储线程标识,还要存储可重入的次数 ,第一次获取锁我们就把次数+1,当别的线程再来去获取的锁的时候,他先去判断这个锁是不是有人了,有人获取锁不代表失败!!这个时候他再去判断一下这个获取锁的线程标识是不是自己!不是自己就放弃!!是自己的话,这个时候他再去获取锁,然后把次数再+1,然后执行自己的业务,执行完业务这个时候释放锁时,要先去判断这个线程标识 是不是自己的!不是自己的什么都不做!是自己的,这个时候呢,把次数-1,然后判断是不是为0,为0说明这个时候没有线程是获取锁的状态,这个时候就可以把锁直接删除!!不为0,说明当前的线程获取锁在执行其他的业务,我们不要管就行了,然后就结束了!!!!
上面一段话,就是实现可重入锁的核心原理个人见解。其实不难理解的
对应的图,可大致如下:
一定是次数为0,这个时候删除锁!!!不为0,说明有人在用!!!
这个图,自己画的有些草率,但不妨碍理解,结合上面我总结的,你可以去跟一遍流程就OK了!!!上图是原理的大致展示,有一些细节上面展示的不到位!!!(你去看源码他的流程,其内容也就是我上面展示的这些)
OK,到这里自己的个人总结,分享完毕!感兴趣的话,评论区可以聊聊。