ReentrantLock关键组件分析

  1. /**
  2. * Creates an instance of {@code ReentrantLock}.
  3. * This is equivalent to using {@code ReentrantLock(false)}.
  4. */
  5. public ReentrantLock() {
  6. sync = new NonfairSync();
  7. }

默认的构造函数这里,创建了一个Sync,NonfairSync,是一个非常关键的组件,是底层专门用于加锁和释放锁的核心组件

  1. public void lock() {
  2. sync.lock();
  3. }
  1. ReentrantLock在进行加锁的时候,实际上是基于底层的sync调用lock方法进行加锁,ReentrantLock只不过是外面比较薄的一层。
  1. public void lock() {
  2. sync.lock();
  3. }
  1. sync:一个抽象的静态内部类,这个东西继承了AQSAbstractQueuedSynchronizer。抽象队列同步器,是java并发包各种并发工具(锁、同步器)的底层的基础性的组件,核心的,主要是依赖于他。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317535/1634830954405-1c789ace-b799-4cb7-8914-96ff9453f26c.png#clientId=u123cceb6-06d7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=147&id=u2edb09ab&margin=%5Bobject%20Object%5D&name=image.png&originHeight=247&originWidth=977&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29922&status=done&style=none&taskId=u896be895-9b4c-4f9a-b6c7-be820197924&title=&width=582.5)<br />可以看到下面AQS的uml类图,AQS里关键的一些东西,一个是Node(自定义数据结构,可以组成一个双向链表,也就是所谓的一个队列),state(核心变量,加锁、释放锁都是基于state来完成的)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317535/1634831475480-68934782-772f-42b0-9425-60c90c8ee7c0.png#clientId=u123cceb6-06d7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=380&id=u8836e3cd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=759&originWidth=1256&originalType=binary&ratio=1&rotation=0&showTitle=false&size=99399&status=done&style=none&taskId=u852685b2-9777-4acd-8aab-2565a9b0860&title=&width=628) <br />再来看下,ReentrantLock构造函数创建的sync是什么?<br />NonfairSync是Sync的一个子类,覆盖重写了几个方法,没什么特别的东西在里面,代表了一个Sync的具体实现
  1. /**
  2. * Sync object for non-fair locks
  3. */
  4. static final class NonfairSync extends Sync {
  5. private static final long serialVersionUID = 7316153563782823691L;
  6. /**
  7. * Performs lock. Try immediate barge, backing up to normal
  8. * acquire on failure.
  9. */
  10. final void lock() {
  11. if (compareAndSetState(0, 1))
  12. setExclusiveOwnerThread(Thread.currentThread());
  13. else
  14. acquire(1);
  15. }
  16. protected final boolean tryAcquire(int acquires) {
  17. return nonfairTryAcquire(acquires);
  18. }
  19. }