AQS原理分析
什么是AQS
AQS在java源码中主要是指AbstractQueuedSynchronizer(抽象队列同步器)抽象类。
它整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int
类型变量表示持有锁的状态。
为什么AQS是JUC的基石
凡是实现锁机制的一些抽象接口,底层都是依靠AQS实现的
进一步理解锁和同步器的关系
同步器:面向锁的实现者,java并发大神DougLee,提出同意规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等。是一切锁和同步组件实现的——公共基础部分。
AQS是干嘛的
抢到资源的线程直接使用处理业务。抢不到资源的必然涉及一种排队等候机制。抢占资源失败的线程继续去等待(类似银行业务办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等候),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)。
既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?(AQS)
如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配
。这个机制主要用的是CLH队列
的变体(双向队列)实现的