读懂Java并发系列——5.AQS原理

155 阅读1分钟

直接看:www.cnblogs.com/waterystone…

1. AQS基础探究

AQS:AbstractQueuedSynchronizer,抽象队列同步器,是java中同步器和锁机制实现的基础类,主要用于封装线程的队列,并通过模版方法的使用,将一系列获取释放锁的机制模版化,开发者只需要实现它的几个protected方法即可实现锁等功能。

2. AQS面试题问答

  1. AQS中常见的变量和方法及作用
  • state变量 private volatile int state; 用来表明加锁次数,初始化时state==0,当有一个线程获得成功时将变为state==1; 其它线程看到state不等于0时,会判断出它已经被占用。
  • AbstractOwnableSynchronizer类 此类中只有一个变量exclusiveOwnerThread和其对应的set/get方法,用来表明独占锁状态下当前占锁的线程
public abstract class AbstractOwnableSynchronizer
    implements java.io.Serializable {

    /** Use serial ID even though all fields transient. */
    private static final long serialVersionUID = 3737899427754241961L;
    protected AbstractOwnableSynchronizer() { }
    private transient Thread exclusiveOwnerThread;
    protected final void setExclusiveOwnerThread(Thread thread) {
        exclusiveOwnerThread = thread;
    }
    protected final Thread getExclusiveOwnerThread() {
        return exclusiveOwnerThread;
    }
}

  • 如何利用AQS编写自己的同步器 只需要重写AQS中的几个protected方法即可
    a. tryAcquire(int arg);
    b. tryRelease(int arg);
    c. tryAcquireShared(int arg)
    d. tryReleaseShared(int arg);

AQS中充分利用了模版方法,如获取锁的acquire(int arg)方法

    public final void acquire(int arg) {
        // 其中需要自己实现tryAcquire(int arg)方法
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

3. AQS的实际应用

todo ReentrantLock、CountDownLatch和Semphore的底层都是使用的AQS实现。