美文网首页
AQS学习笔记

AQS学习笔记

作者: ssochi | 来源:发表于2019-11-21 11:42 被阅读0次

    AQS AbstractQueueSynchronizer

    一个帮助实现同步锁功能的框架。底层基于FIFO队列,提供部分方法供用户扩展。

    抽象方法:

    • tryAcquire
    • tryAcquireShared
    • tryRelease
    • tryReleaseShared

    提供方法:

    • setState
    • getState
    • compareAndSetState
    • acquire
    • acquireShared
    • release
    • releaseShared

    state为AQS内部的状态位,实现类应尽量使用它来记录状态,如果int不够用才在外层加入状态
    acquire 先执行tryAcquire,若失败则将当前节点以独占(exclusive)模式加入队列,并挂起
    acquireShared 先执行tryAcquireShared,若失败则将当前节点以分享(shared)加入队列,并挂起

    release 先执行tryRelease,若成功则将队列头节点线程unpark,若头结点为shared模式,则将之后的shared模式节点都unpark
    releaseShared 先执行tryReleaseShared,若成功则将队列头节点线程unpark,若头结点为shared模式,则将之后的shared模式节点都unpark

    [若头结点为shared模式,则将之后的shared模式节点都unpark] 这一步实际是线程unpark后,在doAcquire和doAcquireShared里的执行逻辑

    实现公平锁:

    tryAcquire -> 如果头节点为空,才尝试cas设置state. 可以理解为不插队
    实现非公平锁:
    tryAcquire -> 无论头节点是否为空,都尝试cas设置state。

    可重入锁:

    tryAcquire -> 若持有锁的线程为当前线程,则state++,return false
    tryRelease -> 若state--,若state==0 return true

    读写锁:

    读写锁同时使用一个AQS,AQS中的state,高位表示读持锁,地位表示写持锁

    读锁

    tryAcquireShared 读取state,如果不处于独占锁状态,则cas添加state,并设置threadLocal变量记录持锁次数,若处于独占锁状态,
    便调用acquireShare,以shared模式添加到队列中
    tryRelease cas减少state,若state=0,则return true。

    写锁

    tryAcquire 读取state,若state=0,则cas修改state,使其处于独占状态。state位于别的状态tryAcquire都失败
    tryRelease cas减少state,若state=0 则return true.

    相关文章

      网友评论

          本文标题:AQS学习笔记

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