同步器AQS解析

Posted huanStephen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步器AQS解析相关的知识,希望对你有一定的参考价值。

什么是同步器?

  多线程并发执行,通过某种共享状态来同步,当共享状态满足某种条件,才能触发线程开始执行操作。

 

AbstractQueuedSynchronizer(AQS)

  这是一个抽象类,它提供多线程下不同共享模式的操作,实现它可以自定义同步器。

可以看出,ReentrantLock和ReentrantReadWriteLock的内部类都是继承于这个抽象类。

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

    private static final long serialVersionUID = 7270805090050340580L;
    // 底层操作
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    // 线程节点
    static final class Node {
        static final Node SHARED = new Node();
        static final Node EXCLUSIVE = null;
        static final int CANCELLED =  1;
        static final int SIGNAL    = -1;
        static final int CONDITION = -2;
        static final int PROPAGATE = -3;
        volatile int waitStatus;
        volatile Node prev;
        volatile Node next;
        volatile Thread thread;
        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() {
        }

        Node(Thread thread, Node mode) {
            this.nextWaiter = mode;
            this.thread = thread;
        }

        Node(Thread thread, int waitStatus) {
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
    }
    // 头结点
    private transient volatile Node head;
    // 尾节点
    private transient volatile Node tail;
    // 共享状态
    private volatile int state;
    // 独占锁获取
    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }
    // 独占锁释放
    protected boolean tryRelease(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁获取
    protected int tryAcquireShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁释放
    protected boolean tryReleaseShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 快速判断被线程独占
    protected boolean isHeldExclusively() {
        throw new UnsupportedOperationException();
    }
    // 获取同步状态
    protected final int getState() {
        return state;
    }
    // 设置同步状态
    protected final void setState(int newState) {
        state = newState;
    }
    // 原子操作同步状态
    protected final boolean compareAndSetState(int expect, int update) {
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
    // 其他方法...
}

以上就是AQS里关键的几个需要重写的方法,这里没有将方法定义为abstract,而是方法只抛出一个异常,这是因为AQS有很多方法可以重写,而又不是每个都需要,所以就没有写成abstract。

以上是关于同步器AQS解析的主要内容,如果未能解决你的问题,请参考以下文章

AQS解析与实战

AQS(队列同步器)

聊聊高并发(二十四)解析java.util.concurrent各个组件 深入理解AQS

AQS 原理解析以及源码分析

源码级深挖AQS队列同步器

AQS (Abstract Queued Synchronizer)源码解析 -- 独占锁与共享锁的加锁与解锁