手撕AQS源码第二弹 -- AQS常见方法

AQS常见方法

首先我们研究源码的时候,应该研究核心源码,只要研究完核心源码,其他的源码无非就是在此基础上的一些附加功能。

AQS的源码也就2000多行,我们对AQS的方法进行简单的分类:

CAS相关

CAS没什么好说的,只要是任何修改值的操作,都可以用CAS的原子操作进行。

返回值方法名描述
booleancompareAndSetStateCAS尝试修改锁状态
booleancompareAndSetHeadCAS尝试修改队列头
booleancompareAndSetTailCAS尝试修改队列尾
booleancompareAndSetWaitStatusCAS尝试修改节点状态
booleancompareAndSetNextCAS尝试设置下一个节点

加锁相关

其中方法名中有shared的是共享锁,这些try起头的方法方法体里面直接是throw new UnsupportedOperationException(),这些方法的细节都依靠于实现类去重写才有意义。

返回值方法名描述
booleantryAcquire尝试获得锁
booleantryAcquireNanos尝试在给定时间获得锁
voidacquire获得锁(封装了tryAcquire)
voidacquireInterruptibly不断尝试获得锁
booleantryAcquireSharedNanos尝试获得共享锁
inttryAcquireShared尝试在给定时间获得共享锁
voidacquireShared获得共享锁(封装了tryAcquireShared)
voidacquireSharedInterruptibly不断尝试获得共享锁

解锁相关

和加锁一样,try起头的方法里面都是抛异常,都需要子类去重写。

返回值方法名描述
booleantryRelease尝试释放锁
booleantryReleaseShared尝试释放共享锁
booleanrelease尝试释放锁(封装了tryRelease)
booleanreleaseShared尝试释放共享锁(封装了tryReleaseShared)

维护队列相关

这部分的方法一般用于监控队列时使用,比如线程执行缓慢,可以查看等待队列是否有问题。

返回值方法名描述
booleanhasQueuedThreads是否有线程在排队
ThreadgetFirstQueuedThread获取第一个排队线程
booleanisQueued(Thread)判断线程是否在队列中
booleanhasQueuedPredecessors判断一个线程前面是否有线程在排队
intgetQueueLength获取等待队列的长度
CollectiongetQueuedThreads获取所有等待队列的线程的集合

其他方法

还有很多其他方法,但是使用率并不高,一般是用于维护AQS的使用情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值