#头条创作挑战赛# ReentrantLock是可重入锁,是怎么实现的?几张源码图看明白
可重入锁代表当前线程加锁成功后,执行任务过程中,需要加锁的时候,依然可以再去拿到锁。
ReentrantLock公平锁和非公平锁都是继承自AQS,加锁的代码 acquire(1) ,是通过改变 int 类型 state 变量,变量+1代表加一次锁,state初始值为0。
具体实现看第一张图
第一次加锁成功,state变量:0-->1,同时锁会记住当前线程。
第二次尝试加锁,会比较线程名字,如果是同一线程,那么state此时会:1-->2。
第三次加锁,同样的,state:2-->3。
依此循环,可以出现N次加锁。
加锁可重入,解锁有什么注意事项呢?看第二张图
解锁 tryRelease , 每次 release(1)
对于重入过的锁,state肯定大于1
那么真正解锁成功,state是需要为0的
理论上,加一次锁,就会解一次锁,对应+1,-1
所以 release(1)不代表解锁成功,只有在state=0的时候,free=true,才代表解锁成功
以上就是可重入锁的加锁与解锁