AQS使用解析

AbstractQueuedSynchronizer

AQS是基于FIFO队列的实现,AQS使用了模板方法的设计模式,以ReentranLock为例子获取独占锁时

ReentranLock.lock
ReentranLock.Sync.lock
AbstractQueuedSynchronizer.acquire
ReentranLock.Sync.tryAcquire

AbstractQueuedSynchronizer.acquire是模板方法,它会调用sync的tryAcquire的子类实现方法,如果子类的tryAcquire返回的是false,它会将当前线程挂起,并将其封装到Node放入队列中。

属 性定 义
Node SHARED = new Node()表示Node处于共享模式
Node EXCLUSIVE = null表示Node处于独占模式
int CANCELLED = 1因为超时或者中断,Node被设置为取消状态,被取消的Node不应该去竞争锁,只能保持取消状态不变,不能转换为其他状态,处于这种状态的Node会被踢出队列,被GC回收
int SIGNAL = -1表示这个Node的继任Node被阻塞了,到时需要通知它
int CONDITION = -2表示这个Node在条件队列中,因为等待某个条件而被阻塞
int PROPAGATE = -3使用在共享模式头Node有可能处于这种状态, 表示锁的下一次获取可以无条件传播
int waitStatus0,新Node会处于这种状态
Node prev队列中某个Node的前驱Node
Node next队列中某个Node的后继Node
Thread thread这个Node持有的线程,表示等待锁的线程
Node nextWaiter表示下一个等待condition的Node

看完了Node,下面再看一下AQS中有哪些变量和方法:

属性/方法含 义
Thread exclusiveOwnerThread这个是AQS父类AbstractOwnableSynchronizer的属性,表示独占模式同步器的当前拥有者
Node上面已经介绍过了,FIFO队列的基本单位
Node headFIFO队列中的头Node
Node tailFIFO队列中的尾Node
int state同步状态,0表示未锁
int getState()获取同步状态
setState(int newState)设置同步状态
boolean compareAndSetState(int expect, int update)利用CAS进行State的设置
long spinForTimeoutThreshold = 1000L线程自旋等待的时间
Node enq(final Node node)插入一个Node到FIFO队列中
Node addWaiter(Node mode)为当前线程和指定模式创建并扩充一个等待队列
void setHead(Node node)设置队列的头Node
void unparkSuccessor(Node node)如果存在的话,唤起Node持有的线程
void doReleaseShared()共享模式下做释放锁的动作
void cancelAcquire(Node node)取消正在进行的Node获取锁的尝试
boolean shouldParkAfterFailedAcquire(Node pred, Node node)在尝试获取锁失败后是否应该禁用当前线程并等待
void selfInterrupt()中断当前线程本身
boolean parkAndCheckInterrupt()禁用当前线程进入等待状态并中断线程本身
boolean acquireQueued(final Node node, int arg)队列中的线程获取锁
tryAcquire(int arg)尝试获得锁(由AQS的子类实现它
tryRelease(int arg)尝试释放锁(由AQS的子类实现它
isHeldExclusively()是否独自持有锁
acquire(int arg)获取锁
release(int arg)释放锁
compareAndSetHead(Node update)利用CAS设置头Node
compareAndSetTail(Node expect, Node update)利用CAS设置尾Node
compareAndSetWaitStatus(Node node, int expect, int update)利用CAS设置某个Node中的等待状态
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值