美文网首页
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