AQS是一個(gè)用來(lái)構(gòu)建鎖和同步器的框架,使用AQS能簡(jiǎn)單且高效地構(gòu)造出應(yīng)用廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸如ReentrantReadWriteLock,SynchronousQueue,F(xiàn)utureTask等等皆是基于A(yíng)QS的。
AQS核心思想是,如果被請(qǐng)求的共享資源空閑,則將當(dāng)前請(qǐng)求資源的線(xiàn)程設(shè)置為有效的工作線(xiàn)程,并且將共享資源設(shè)置為鎖定狀態(tài)。如果被請(qǐng)求的共享資源被占用,那么就需要一套線(xiàn)程阻塞等待以及被喚醒時(shí)鎖分配的機(jī)制,這個(gè)機(jī)制AQS是用CLH隊(duì)列鎖實(shí)現(xiàn)的,即將暫時(shí)獲取不到鎖的線(xiàn)程加入到隊(duì)列中。
AbstractQueuedSynchronizer類(lèi)底層的數(shù)據(jù)結(jié)構(gòu)是使用CLH(Craig,Landin,and Hagersten)隊(duì)列是一個(gè)虛擬的雙向隊(duì)列(虛擬的雙向隊(duì)列即不存在隊(duì)列實(shí)例,僅存在結(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系)。AQS是將每條請(qǐng)求共享資源的線(xiàn)程封裝成一個(gè)CLH鎖隊(duì)列的一個(gè)結(jié)點(diǎn)(Node)來(lái)實(shí)現(xiàn)鎖的分配。其中Sync queue,即同步隊(duì)列,是雙向鏈表,包括head結(jié)點(diǎn)和tail結(jié)點(diǎn),head結(jié)點(diǎn)主要用作后續(xù)的調(diào)度。而Condition queue不是必須的,其是一個(gè)單向鏈表,只有當(dāng)使用Condition時(shí),才會(huì)存在此單向鏈表。并且可能會(huì)有多個(gè)Condition queue。