# AQS > 这个先留着,这个内容有点多,待我这周结束之后来写。 面试官:AQS是什么? ## 原理 我:AbstractQueuedSynchronizer抽象同步队列。说白了,就是个FIFO双向队列。其内部通过节点head和tail记录对首和队尾元素。 **state**:在AQS中维持了一个单一的状态信息state,可以通过**getState**、**setState**、**compareAndSetState**函数修改其值。 - **ReentrantLock**:state可以用来表示当前线程获取锁的可重入次数。 - **ReentrantReadWriteLock**:state的高16位表示读状态,也就是获取该读锁的次数,低16位表示获取到写锁的线程的可重入次数。 - **semaphore**:state用来表示当前可用信号的个数。 - **CountDownlatch**:state用来表示计数器当前的值。 对于AQS来讲,线程同步的关键是对状态值**state**进行操作。 ## 方法 在独占方式下获取和释放资源使用的方法: ```java void acquire(int arg); void acquireInterruptibly(int arg); boolean release(int arg); ``` 在共享方式获取和释放资源使用的方法: ```java void acquireShared(int arg); void acquireSharedInterruptibly(int arg); boolean releaseShared(int arg); ``` 使用独占方式获取的资源是与**具体线程绑定**的,就是说如果一个线程获取到了资源,就会标记是这个线程获取到