美文网首页
AbstractQueueSynchronizer AQS

AbstractQueueSynchronizer AQS

作者: 超能小蚂蚁 | 来源:发表于2019-10-06 10:56 被阅读0次

    AbstractQueueSynchronizer AQS

    使用Node实现FIFO队列,Node中包含 前驱,后继,节点类型(nextWaiter),节点状态(waitStatus),所属线程

    用state标示状态 0:还没有线程获取锁 1;有一个线程获取锁  >1:重入锁的数量

    AQS入队 acquire

    尝试获取锁资源(tryAcquire())->获取锁失败 ->构建Node节点(addWaiter) ->初始化AQS队列并入队 ->自旋 ->获取锁失败或前驱节点不为head节点 ->更改前驱节点状态为-1 ->挂起当前线程

    AQS释放 release

    尝试释放(tryRelease)-> 将head节点waiteStatus更改为0->唤醒head节点的子节点->继续自旋执行入队挂起线程-> 前驱节点为head节点获取资源成功->head指针后移(setHead())->推出自旋

    共享锁 当 前驱节点为head节点获取资源成功->检查资源状态是否足够满足下一节点->满足则继续释放

    tryAcquire

    CountDownLatch

              获取AQS state 数量,state等于0继续执行,state大于0入队自选挂起等待被唤起

    Semaphore

              计算AQS state与acquire资源之差 若remain小于0 表示资源不足入对等待挂起,若remain>0 CAS方式改变state

    ReentrantLock

              重入锁 若锁已被当前线程持有,则count+1并立刻返回执行后续。若锁被其他线程持有 进入AQS阻塞队列。

    ReentrantReadWriteLock

              重入锁 高16位代表读锁 低16位代表写锁

              写锁获取

                   state不为0->低16位不为0->是否为本线程获取->本线程获取cas+1返回true 否则 进入AQS阻塞队列

              获取读锁

                   state低16位为0->高16位cas+1->acquire返回true

    相关文章

      网友评论

          本文标题:AbstractQueueSynchronizer AQS

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