ReentrantLock源码解析
前面刚学习了AQS的基本原理,主要通过两个队列实现功能(同步队列+等待队列,前者是双向链表,实现加锁和解锁,后者是单向链表,用做同步协作,阻塞、唤醒),正好可以趁热打铁,了解一下ReentrantLock的源码,有了AQS的基础,阅读ReentrantLock的源码是非常简单的,如果没有了解AQS原理的同学,可以参考: AbstractQueuedSynchronizer源码(上)–排他锁 AbstractQueuedSynchronizer源码(下)–共享锁和Condition条件队列 我们都知道ReentrantLock的底层就是通过AQS实现,和Synchronized一样都是可重入锁,同时也是排他锁,所以ReentrantLock只能一个线程获取锁,但是线程可以获取当前资源的多重锁,对应锁数量+1,每次释放-1,直到等于0,才可以被其他线程竞争获取锁,有点引用计数法的意思。 类定义: public class ReentrantLock implements Lock , java . io . Serializable { private final Sync sync ; //默认构造函数,得到的事非公平锁 public ReentrantLock ( ) { sync = new NonfairSync ( ) ; } //支持传入fair参数,得到是否公平锁