关于aqs:AQS及其组件的核心原理

6次阅读

共计 943 个字符,预计需要花费 3 分钟才能阅读完成。

AQS,全称 AbstractQuenedSynchronizer, 能够了解为形象的队列同步器。
一、AQS 的核心思想
AQS 核心思想是,如果被申请的共享资源闲暇,则将以后申请资源的线程设置为无效的工作线程,并且将共享资源设置为锁定状态。如果被申请的共享资源被占用,那么就须要一套线程阻塞期待以及被唤醒时锁调配的机制,这个机制 AQS 是用 CLH 队列锁实现的,行将临时获取不到锁的线程退出到队列中。
二、实现原理

1、private volatile int state:AQS 应用一个 int 成员变量来示意同步状态,通过内置的 FIFO 队列来实现获取资源线程的排队工作。AQS 应用 CAS 对该同步状态进行原子操作实现对其值的批改。

 // 获取状态    protected final int getState() {        return state;}
 // 设置状态值
  protected final void setState(int newState) {state = newState;}
 // 通过 CAS 批改状态
  protected final boolean compareAndSetState(int expect, int update) {        // See below for intrinsics setup to support this
      return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
  }

在 ReentrantLock 中,stste 示意获取锁的线程数,如果 state=0,示意还没有线程获取锁,1 示意有线程获取了锁。大于 1 示意重入锁的数量。

2、CLH(Craig,Landin,and Hagersten)队列是一个虚构的双向队列(虚构的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS 是将每条申请共享资源的线程封装成一个 CLH 锁队列的一个结点(Node)来实现锁的调配。
三、ReentrantLock 中的偏心锁与非偏心锁
 偏心锁:以后线程在抢锁之前先看看队列中是否有排队的线程,如果有则不容许抢,间接退出队列。

非偏心锁:以后线程在抢锁之前不须要查看队列中是否有排队的线程。
利用待补充

正文完
 0