java ReentrantLock 可重入锁的源码分析
ReentrantLock是一个可重入锁。
解释:在当前线程中可以重复的获取锁。一个进入了递归操作,普通的锁是不支持的,需要等待锁释放,这个时候就造成了线程一直阻塞,所以要引入可重入锁。
下图是ReentrantLock类中的方法。这里面用到了AQS的知识点,如果不会,请先学习。

sync是一个抽象类,继承了AbstractQueuedSynchronizer(AQS),因为ReentrantLock可以获取多次锁,类似于是一个共享式的锁,实现了tryRelease方法。

FairSync是一个公平锁,NonfairSync不是一个公平锁。
当没有获取锁就进入等待的状态(AQS有介绍),当锁被释放出来,这个时候如果有用户需要锁。
公平锁:该用户必须排队到最后面。非公平锁:该用户可以和队列去竞争锁。

调用lock方法时,会调用sync的lock方法。 syc类中的lock是一个abstract抽象方法,两个实现类了一个是公平锁一个是非公平锁。
具体调用的哪个?是根据你初始化ReentrantLock决定的。默认情况是非公平锁,当时TRUE时候,是公平锁。



下图是非公平锁的,首先会执行CAS操作,如果成功,则获取到了锁,不用阻塞,如果没有成功,则执行acquire方法。
该方法会调用父类的acquire方法,该方法首先会调用tryAcquire方法,该方法又是非公平锁的tryAcquire方法,返回的nofairTryAcquire方法,该方法在父类的sync当中。



总结:以上的方法是调来调去的,比较麻烦,而且会让人看不懂。所以我总结了一下时序图,供大家参考。


浙公网安备 33010602011771号