类图:
java.util.concurrent.locks.AbstractOwnableSynchronizer 源码:
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;
}
}
已知子类:
AbstractQueuedLongSynchronizer, AbstractQueuedSynchronizer
该抽象类的主要作用是:记录当前占用独占锁(互斥锁)的线程实例。
例如:
在ReentrantLock 源码中,ReentrantLock 中的 Sync 内部类继承了AbstractQueuedSynchronizer。
在非公平方式获取锁的实现中,若获取锁成功,就会执行:setExclusiveOwnerThread(current);
//没有线程正在竞争该锁
if (c == 0) {
// 继承至AbstractQueuedSynchronizer的方法
if (compareAndSetState(0, acquires)) {//若state为0则将state修改为acquires的值,状态0表示锁没有被占用
//AbstractQueuedSynchronizer继承至AbstractOwnableSynchronizer的方法
setExclusiveOwnerThread(current);// 设置当前线程独占
return true;// 成功
}
}
在试图在共享模式下获取共享锁(读取锁)时,如果获取读取锁成功,就会执行:setExclusiveOwnerThread(null); 释放独占的锁。