ReentrantLock关键组件分析
/*** Creates an instance of {@code ReentrantLock}.* This is equivalent to using {@code ReentrantLock(false)}.*/public ReentrantLock() {sync = new NonfairSync();}
默认的构造函数这里,创建了一个Sync,NonfairSync,是一个非常关键的组件,是底层专门用于加锁和释放锁的核心组件
public void lock() {sync.lock();}
ReentrantLock在进行加锁的时候,实际上是基于底层的sync调用lock方法进行加锁,ReentrantLock只不过是外面比较薄的一层。
public void lock() {sync.lock();}
sync:一个抽象的静态内部类,这个东西继承了AQS:AbstractQueuedSynchronizer。抽象队列同步器,是java并发包各种并发工具(锁、同步器)的底层的基础性的组件,核心的,主要是依赖于他。<br /><br />可以看到下面AQS的uml类图,AQS里关键的一些东西,一个是Node(自定义数据结构,可以组成一个双向链表,也就是所谓的一个队列),state(核心变量,加锁、释放锁都是基于state来完成的)<br /> <br />再来看下,ReentrantLock构造函数创建的sync是什么?<br />NonfairSync是Sync的一个子类,覆盖重写了几个方法,没什么特别的东西在里面,代表了一个Sync的具体实现
/*** Sync object for non-fair locks*/static final class NonfairSync extends Sync {private static final long serialVersionUID = 7316153563782823691L;/*** Performs lock. Try immediate barge, backing up to normal* acquire on failure.*/final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}}
