前言
如果说Lock是用户和锁的交互接口,那么AQS就是锁的实现。它将所有竞争锁的线程排队,内部维护了同步状态管理、线程的排队、等待与唤醒等。
利用AQS的模板方法我们可以很方便地实现自己的锁
AQS中特别重要的2个属性
1 state : 代表当前锁是否被占用。0代表未占用,1代表被占用(则其他线程将无法获得锁)
2 exclusiveOwnerThread:只有再state显示被占用的情况下,此值则表示占用当前锁的线程。
获得锁的过程(lock())
获得锁的实质就是改变上面2个状态。
1 先判断state是否被占用,如果没有被占用,则CAS操作,将state改成1,并将exclusiveOwnerThread指向当前线程。
2 在多线程竞争的情况下,只有1个线程能获得锁,其他获得锁失败的线程,将被包装成节点,加到同步队列的最末尾。加到同步队列之后,线程将开始不停自旋。

3 自旋过程中,主要做2件事。1判断当前节点的前继节点是否是头节点。头节点就代表了该节点内部的线程是占据锁的线程。那么头节点线程执行完毕后是会唤醒后继线程的。所以失败的线程进入自旋后会首先检测头节点是否为头节点,如果是,则当前节点就有则个

网友评论