1AQS是什么
java.util.concurrent包中,LOCK用到了一个同步队列AQS - AbstractQueuedSynchronizer
1.1AQS的功能
独占和共享,即 排他锁/非排他锁
共享:允许多个线程同时获取锁,并发访问共享资源资源,比如ReentrantReadWriteLock
1.2AQS的内部实现
AQS队列内部维护的是一个FIFO的双向链表
如图示,每一个NODE节点由线程封装,当线程争抢锁失败后会封装成NODE加入到AQS队列中去;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点(即线程)。即释放锁和锁竞争的时候会影响AQS队列的变化。
1.3AQS队列变化分析
如图所示,线程A获取锁之后,将自己设置成为头节点。在AQS队列中,head节点表示获取锁成功的节点。当线程B来竞争锁的时候。会涉及到两个变化。
新的线程封装成为新的NODE节点追加到同步队列中
1.设置自身的prev节点指向获取锁的node节点,即head节点
2.设置获取锁的next节点指向新加入的node节点
当头节点释放同步状态时,会唤醒后继节点,如果后继节点获得锁成功。
1.将自身设置为head节点
2.设置自身prev节点指向null
值得注意的是,设置head节点不需要用CAS,原因是该操作由获得锁的线程完成,而同步锁只能由一个xian线程获得,不需要CAS保证,只需要把原head节点的后继节点设置成为head节点,并且断开原head节点的next引用即可。