天天看点

28 AbstractQueuedSynchronizer(AQS)详解

  1. 在了解AQS之前,首先需要理解公平锁和非公平锁
  2. ReentranLock分为公平锁和非公平锁。二者的区别就在获取锁机会是否和排队顺序相关
  3. 公平锁: 公平是针对锁的获取而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序

    就是说:如果锁被另一个线程持有,那么其他申请锁的线程会被挂起等待,加入等待队列。如果是公平的,那么就应该谁先申请锁,谁排在等待队列的最前面。后申请的就应该排在后面。

  4. 当锁被释放的时候,通知等待线程再次尝试获取锁,公平锁会让最先进入队列的线程获得锁。而非公平锁则会唤醒所有线程,让它们再次竞争尝试获取锁,所以可能会导致后来的线程先获得了锁,这就是非公平锁。
  5. 通过观察源码可以知道,ReentrantLock实现的加锁,释放锁的底层实现原理就是AQS.
  6. 基本上所有的方法的实现实际上都是调用了其静态内存类Sync中的方法,而Sync类继承了AbstractQueuedSynchronizer(AQS)
  7. 所以想要理解ReentrantLock这个类,关键核心在于对队列同步器AbstractQueuedSynchronizer的理解。

    注意思考一下,此处为什么称其为队列同步器?作者的解释如下:

    Provides a framework for implementing blocking locks and related

    synchronizers (semaphores, events, etc) that rely on(依靠,依赖)

    first-in-first-out (FIFO)(先进先出) wait queues…

    队列同步器提供用来构建锁和其他同步组件的框架,它的实现主要依赖一个int成员变量来表示同步状态以及通过一个FIFO队列构成等待队列。它的子类必须重写AQS的几个protected修饰的用来改变同步状态的方法,其他方法主要是实现了排队和阻塞机制。

此处的state就是volatile修饰的。所以此处首先确保了state的可见性

28 AbstractQueuedSynchronizer(AQS)详解

8. 队列同步器(AQS)没有实现任何同步接口,AQS也是继承了一个抽象类而已,**

9. AQS定义了若干同步状态的获取和释放方法**这样做的目的是用来供自定义同步组件的使用,队列同步器(AQS)既支持独占式获取同步状态,也可以支持共享式获取同步状态,这样就可以方便的实现不同类型的同步组件。

10.

继续阅读