java.util.concurrent.locks.AbstractOwnableSynchronizer 抽象类 源码

类图:

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;
    }
}

已知子类:html

    AbstractQueuedLongSynchronizerAbstractQueuedSynchronizerjava

    该抽象类的主要做用是:记录当前占用独占锁(互斥锁)的线程实例。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);  释放独占的锁。 线程

相关文章
相关标签/搜索