什么是AQS
ReentrantLock、ReentrantReadWriteLock底层都是基于AQS来实现的
AQS的全称是AbstractQueuedSynchronizer,是抽象队列同步器,其实他就是一个用来构建锁和同步器的框架,内部实现的关键是:先进先出的队列、state状态,在LOCK包中的相关锁(常用的有ReentrantLock、 ReadWriteLock)都是基于AQS来构建。
AQS的核心思想是什么?它是怎么实现的?
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用。
AQS使用一个voliate int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS对该同步状态进行原子操作实现对其值的修改。
AQS定义了两种资源获取方式:独占(只有一个线程能访问执行)和共享(多个线程可同时访问执行)
AQS:操作资源的方式有独占和共享两种方式,在理解它之前,先去了解它如何使用,我们随便写一个类,再写一个内部类继承AQS,重写特定的方法就可以使用,因为有独占和共享两种方式所以也有对应的方法,独占有tryAcquire和tryRelease。共享有tryAcquireShared和tryReleaseShared。AQS的核心由一个阻塞队列和一个volatile修饰的state变量组成。AQS可以通过cas对state变量进行修改,一般来说,state为0时表示无锁状态,state大于0时表示有线程获得锁。从代码上看,如果我们调用lock方法是,触发Acquire方法,该方法又会去调用tryAcquire方法以cas的方式尝试获取锁,如果获取失败,就调用addWaiter方法把当前线程包装为Node对象添加到阻塞队列中。然后调用acquireQueued方法通过自旋去获取锁。