天天看点

#头条创作挑战赛#ReentrantLock是可重入锁,是怎么实现的?几张源码图看明白可重入锁代表当前线程加锁成功后,执

作者:JAVA面试官

#头条创作挑战赛# 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,才代表解锁成功

以上就是可重入锁的加锁与解锁

#头条创作挑战赛#ReentrantLock是可重入锁,是怎么实现的?几张源码图看明白可重入锁代表当前线程加锁成功后,执
#头条创作挑战赛#ReentrantLock是可重入锁,是怎么实现的?几张源码图看明白可重入锁代表当前线程加锁成功后,执
#头条创作挑战赛#ReentrantLock是可重入锁,是怎么实现的?几张源码图看明白可重入锁代表当前线程加锁成功后,执

继续阅读