package java.util.concurrent.locks; public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { private static final long serialVersionUID = 3737899427754241961L;//版本号 //保护构造方法,使得只有同一个包或者继承的子类才能够调用 protected AbstractOwnableSynchronizer() { } //独占线程(不参与序列化) private transient Thread exclusiveOwnerThread; //设置独占线程 protected final void setExclusiveOwnerThread(Thread thread) { exclusiveOwnerThread = thread; } //获得独占线程.若是从未设置,则返回 null protected final Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; } }
已知子类:html
AbstractQueuedLongSynchronizer, AbstractQueuedSynchronizerjava
该抽象类的主要做用是:记录当前占用独占锁(互斥锁)的线程实例。api
例如:ui
在ReentrantLock 源码中,ReentrantLock 中的 Sync 内部类继承了AbstractQueuedSynchronizer。spa
在非公平方式获取锁的实现中,若获取锁成功,就会执行:setExclusiveOwnerThread(current);.net
//没有线程正在竞争该锁 if (c == 0) { // 继承至AbstractQueuedSynchronizer的方法 if (compareAndSetState(0, acquires)) {//若state为0则将state修改成acquires的值,状态0表示锁没有被占用 //AbstractQueuedSynchronizer继承至AbstractOwnableSynchronizer的方法 setExclusiveOwnerThread(current);// 设置当前线程独占 return true;// 成功 } }
在试图在共享模式下获取共享锁(读取锁)时,若是获取读取锁成功,就会执行:setExclusiveOwnerThread(null); 释放独占的锁。 线程