aqs

**
aqs思想:cas+park+自旋 实现同步**
cas+共享资源线程保证只有一个线程成功 自旋 死循环,没有cpu切换
在这里插入图片描述
上锁过程
tryAcquire(arg)尝试加锁,如果加锁失败则会调用acquireQueued方法加入队列去排队,如果加锁成功则不会调用
加入队列之后线程会立马park,等到解锁之后会被unpark,醒来之后判断自己是否被打断了
在这里插入图片描述
tryAcquire 尝试加锁
//获取lock对象的上锁状态,如果锁是自由状态则=0,如果被上锁则为1,大于1表示重入
//没人占用锁—>我要去上锁–hasQueuedPredecessors判断自己是否需要排队–如果不需要排队则进行cas尝试加锁
//如果C不等于0–线程不等于拥有锁的线程–加锁失败–当前线程等于拥有锁的线程则表示这是一次重入,那么直接把状态+1表示重入次数+1
在这里插入图片描述