直接看:www.cnblogs.com/waterystone…
1. AQS基础探究
AQS:AbstractQueuedSynchronizer,抽象队列同步器,是java中同步器和锁机制实现的基础类,主要用于封装线程的队列,并通过模版方法的使用,将一系列获取释放锁的机制模版化,开发者只需要实现它的几个protected方法即可实现锁等功能。
2. AQS面试题问答
- 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实现。