acquire是AQS中的方法,如果CAS操作未能成功,说明state已经不为0,此时继续acquire(1)操作
大家思考一下,acquire方法中的1的参数是用来做什么呢?
这个方法的主要逻辑是
1. 通过tryAcquire尝试获取独占锁,如果成功返回true,失败返回false
2. 如果tryAcquire失败,则会通过addWaiter方法将当前线程封装成Node添加到AQS队列尾部
3. acquireQueued,将Node作为参数,通过自旋去尝试获取锁。
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}