关于java:通俗易懂的JUC源码剖析ReentrantLockAQS

44次阅读

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

AQS 概述

大家可能对 AQS 听得很多,它的全称是 AbstractQueuedSynchronizer,即形象队列同步器,它是 JUC 包中很多同步组件的根底。先来看看它的类档次以及外部数据结构吧。

public abstract class AbstractQueuedSynchronizer
    extends AbstractOwnableSynchronizer
    implements java.io.Serializable {

它的父类 AbstractOwnableSynchronizer 提供了领有独占锁的线程治理性能,有如下重要办法:

// 设置以后领有独占锁的线程
protected final void setExclusiveOwnerThread(Thread thread) {exclusiveOwnerThread = thread;}
// 获取以后领有独占锁的线程
protected final Thread getExclusiveOwnerThread() {return exclusiveOwnerThread;}

再来看 AQS 自身的内部结构。
要害属性:

// 头结点
private transient volatile Node head;
// 尾结点
private transient volatile Node tail;
// 锁状态
private volatile int state;

其中,Node 是 AQS 的外部类,它用来封装线程,组成一个双向的同步队列。代码如下:

static final class Node {
 // SHARED/EXCLUSIVE 示意锁的模式
 // 共享模式
 static final Node SHARED = new Node();
 // 独占模式
 static final Node EXCLUSIVE = null;
 // waitStatus 的值之一,示意以后结点因为超时或中断勾销获取锁。static final int CANCELLED =  1;
 // waitStatus 的值之一,示意以后结点的后继结点须要被唤醒。static final int SIGNAL = -1;
 // waitStatus 的值之一,示意以后结点处于 Condition 条件绑定的的期待队列中,等条件满足,以后结点会被从新移入同步队列中,期待获取锁。static final int CONDITION = -2;
 // waitStatus 的值之一,示意以后结点开释共享资源时,须要把这个信息流传给其余结点,不止是它的后继结点。static final int PROPAGATE = -3;
 // 以后线程的期待状态
 volatile int waitStatus;
 // 以后结点的前继结点
 volatile Node prev;
 // 以后结点的后继结点
 volatile Node next;
 // 封装的线程
 volatile Thread thread;
 // 期待队列中的下一个期待结点
 // 或者非凡值 SHARED/EXCLUSIVE,用来记录是共享锁还是独占锁
 Node nextWaiter;
 
 // 判断是否共享锁
 final boolean isShared() {return nextWaiter == SHARED;}
 
 // 获取以后结点的前继结点
 final Node predecessor() throws NullPointerException {
    Node p = prev;
    if (p == null)
           throw new NullPointerException();
    else return p;
}
 Node() {    // Used to establish initial head or SHARED marker}
 Node(Thread thread, Node mode) {     // Used by addWaiter
     this.nextWaiter = mode;
     this.thread = thread;
 }
 Node(Thread thread, int waitStatus) { // Used by Condition
     this.waitStatus = waitStatus;
     this.thread = thread;
 }

这个先放一放,下次再更新,感兴趣的同学记得关注哦 ^_^

正文完
 0