美文网首页
AbstractQueuedSynchronizer(AQS)—

AbstractQueuedSynchronizer(AQS)—

作者: 雁阵惊寒_zhn | 来源:发表于2020-09-20 12:36 被阅读0次

    AQS做什么的

    AbstractQueuedSynchronizer(AQS)是Java中许多同步类的基类,是一个构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地改造出来。

    AQS框架实现原理

    AQS负责管理同步器类中的状态,管理着一个整数状态信息,可以通过getState()、setState()和compareAndSetState()等方法对state变量进行操作。

    /**
    * The synchronization state.
    */
    private volatile int state;
    

    如果要实现某个同步器,那么需要实现一些保护方法,包括tryAcquire()、tryRelease()、tryAcquireShared()、tryReleaseShared()和isHeldExclusively()等方法。这些方法在子类中重写,并且应该包含对state变量状态改变的操作。

    举个例子,ReentrantLock类中非公平锁的实现:
    tryAcquire()方法调用的nonfairTryAcquire()尝试获取非公平锁。详细讲解在代码中文注释中。

    protected final boolean tryAcquire(int acquires) {
        return nonfairTryAcquire(acquires);
    }
    
    final boolean nonfairTryAcquire(int acquires) {
        //获取当前的线程对象current
        final Thread current = Thread.currentThread();
        //获取state变量的值,代表当前锁的状态
        int c = getState();
        //如果state变量的值为0,表明没有线程获得此锁
        if (c == 0) {
            //比较state值,如果是0,则设置为acquires
            if (compareAndSetState(0, acquires)) {
                //设置当前线程对象current为锁的所有者
                setExclusiveOwnerThread(current);
                return true;
            }
        }
        //如果state变量的值不为0,表明已经有线程获得此锁
        //判断是否为当前线程拥有此锁
        else if (current == getExclusiveOwnerThread()) {
            //如果当前线程拥有锁,进入锁,更新state值
            int nextc = c + acquires;
            if (nextc < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(nextc);
            return true;
        }
        //获取锁失败
        return false;
    }
    

    总结

    基于AQS框架可以高效快速地实现自定义的同步器。大多数开发者不会直接使用AQS,标准的同步器类能够满足绝大多数需求,不过如果可以了解AQS框架的实现方式,对于理解同步器的工作原理是非常有帮助的。

    相关文章

      网友评论

          本文标题:AbstractQueuedSynchronizer(AQS)—

          本文链接:https://www.haomeiwen.com/subject/zkueyktx.html