1.引子
Lock接口的主要实现类ReentrantLock 内部主要是利用一个Sync类型的成员变量sync来委托Lock锁接口的实现,而Sync继承于AbstractQueuedSynchronizer,且大多数java.util.concurrent包下的并发工具类都是利用AbstractQueuedSynchronizer同步器实现的。要想弄明白并发的原理,必须先搞清楚AbstractQueuedSynchronizer的实现机制。
2.同步器AbstractQueuedSynchronizer的父类
AbstractQueuedSynchronizer的直接父类是AbstractOwnableSynchronizer。
AbstractOwnableSynchronizer的类定义
public abstract classAbstractOwnableSynchronizer
implements java.io.Serializable {private static final long serialVersionUID = 3737899427754241961L;protectedAbstractOwnableSynchronizer() {
}privatetransient Thread exclusiveOwnerThread;protected final voidsetExclusiveOwnerThread(Thread thread) {
exclusiveOwnerThread=thread;
}protectedfinal Thread getExclusiveOwnerThread() {returnexclusiveOwnerThread;
}
}
这个类中只有Thread类型exclusiveOwnerThread成员变量的一对setter/getter方法,用来设置/获取独占线程,正如其名中的“Ownable",此类就是"一个线程可能专有的同步器。"这一对setter/getter对于独占锁类型的并发工具特别有用。而ReentrantLock是一个可重入排他锁(排他锁又称独占锁),因此ReentrantLock这类中常用到这两个方法。
同步器AbstractQueuedSynchronizer依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理
原文:https://www.cnblogs.com/gocode/p/12189741.html