AQS常见方法
首先我们研究源码的时候,应该研究核心源码,只要研究完核心源码,其他的源码无非就是在此基础上的一些附加功能。
AQS的源码也就2000多行,我们对AQS的方法进行简单的分类:
CAS相关
CAS没什么好说的,只要是任何修改值的操作,都可以用CAS的原子操作进行。
返回值 | 方法名 | 描述 |
---|---|---|
boolean | compareAndSetState | CAS尝试修改锁状态 |
boolean | compareAndSetHead | CAS尝试修改队列头 |
boolean | compareAndSetTail | CAS尝试修改队列尾 |
boolean | compareAndSetWaitStatus | CAS尝试修改节点状态 |
boolean | compareAndSetNext | CAS尝试设置下一个节点 |
加锁相关
其中方法名中有shared的是共享锁,这些try起头的方法方法体里面直接是throw new UnsupportedOperationException()
,这些方法的细节都依靠于实现类去重写才有意义。
返回值 | 方法名 | 描述 |
---|---|---|
boolean | tryAcquire | 尝试获得锁 |
boolean | tryAcquireNanos | 尝试在给定时间获得锁 |
void | acquire | 获得锁(封装了tryAcquire) |
void | acquireInterruptibly | 不断尝试获得锁 |
boolean | tryAcquireSharedNanos | 尝试获得共享锁 |
int | tryAcquireShared | 尝试在给定时间获得共享锁 |
void | acquireShared | 获得共享锁(封装了tryAcquireShared) |
void | acquireSharedInterruptibly | 不断尝试获得共享锁 |
解锁相关
和加锁一样,try起头的方法里面都是抛异常,都需要子类去重写。
返回值 | 方法名 | 描述 |
---|---|---|
boolean | tryRelease | 尝试释放锁 |
boolean | tryReleaseShared | 尝试释放共享锁 |
boolean | release | 尝试释放锁(封装了tryRelease) |
boolean | releaseShared | 尝试释放共享锁(封装了tryReleaseShared) |
维护队列相关
这部分的方法一般用于监控队列时使用,比如线程执行缓慢,可以查看等待队列是否有问题。
返回值 | 方法名 | 描述 |
---|---|---|
boolean | hasQueuedThreads | 是否有线程在排队 |
Thread | getFirstQueuedThread | 获取第一个排队线程 |
boolean | isQueued(Thread) | 判断线程是否在队列中 |
boolean | hasQueuedPredecessors | 判断一个线程前面是否有线程在排队 |
int | getQueueLength | 获取等待队列的长度 |
Collection | getQueuedThreads | 获取所有等待队列的线程的集合 |
其他方法
还有很多其他方法,但是使用率并不高,一般是用于维护AQS的使用情况。