AQS重入锁原理解析(一)之---基础属性

在学习JUC下包的时候,必然会学习到Lock,同时就会了解到ReentrantLock,而当我们深入了解ReentrantLock锁原理的时候,就会发现它实现了AbstractQueuedSynchronizer的功能,也就是简称的AQS。今天就先从里层到外层的学习,先学习AQS的一些原理属性相关知识。
一:什么是AQS
AbstractQueuedSynchronizer,抽象队列同步器。简称AQS。是JDK提供的,位于J.U.C locks包下的一个抽象类,相当于提供了一个模板,实现让线程排队访问资源的功能,保证资源在被操作的时候是线程安全的。 在J.U.C下的许多类,例如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore,都是通过继承AQS抽象类,加入自己的特定逻辑、实现自己特有的功能。
二:AQS的原理
AQS中维护了一个volatile int state,用来代表共享资源。 与此同时还维护了一个FIFO线程等待队列,当多线程争抢资源遇到阻塞(当state大于0的时候,代表当前资源已经被占有,即遇到了阻塞)的时候会进入此队列等待。 使用volatile关键字可以保证多个线程操作state的时候,线程在任何时候都读到的是最新的值。 等待对列中的线程是通过JVM提供的UNSAFE.park()方法,实现对线程的挂起操作。
三:AbstractQueuedSynchronizer的相关属性
3.1 SHARED: 枚举:共享模式

static final Node SHARED = new Node();

3.2 EXCLUSIVE: 枚举: 独占模式

      static final Node EXCLUSIVE = null;

3.3CANCELLED: 表示当前节点处于 取消状态

static final int CANCELLED =  1;

3.4 SIGNAL: 表示当前节点需要唤醒他的后继节点

 static final int SIGNAL    = -1;

3.5 waitStatus: 当前线程的node状态,可选值(0,signal(-1),CANCELLED (1)

 volatile int waitStatus;

3.6 prev:因为node 需要构建成 fifo队列, 索引 prev 指向前继节点

  volatile Node prev;

3.7 next: 因为node 需要构建成 fifo队列, 索引 next 指向后继节点

 volatile Node next;

3.8 thread : 当前node 封装的 线程

volatile Thread thread;

3.9 head: 头结点

  private transient volatile Node head;

3.10 tail:阻塞队列的尾结点 (阻塞队列不包含 头结点 head.next --> tail 认为是阻塞队列)

private transient volatile Node tail;

3.11 state 在独占模式: 0 表示未加锁状态; >0 表示已经加锁状态

  private volatile int state;

Guess you like

Origin blog.csdn.net/qq_35529931/article/details/119980057