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当中。

 

 

 

 

 

 

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

 

posted @ 2020-03-07 14:39  陌然浅笑  阅读(137)  评论(0)    收藏  举报