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引用即可。
本文深入探讨了java.util.concurrent包中的AQS(AbstractQueuedSynchronizer)机制,详细讲解了其独占和共享锁功能,以及内部FIFO双向链表的实现原理。通过分析线程在获取和释放锁过程中的队列变化,帮助读者理解AQS如何高效地管理线程竞争。
793

被折叠的 条评论
为什么被折叠?



