AQS学习笔记

2019-11-21  本文已影响0人  ssochi

AQS AbstractQueueSynchronizer

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

抽象方法:

提供方法:

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.

上一篇下一篇

猜你喜欢

热点阅读