首先我們從java.util.concurrent.locks包中的AbstraceQueuedSynchronizer說(shuō)起,在下文中稱(chēng)為AQS。
AQS是一個(gè)用于構(gòu)建鎖和同步器的框架。例如在并發(fā)包中的ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等都是基于AOS構(gòu)建,這些鎖都有一個(gè)特點(diǎn),都不是直接擴(kuò)展自AQS,而是都有一個(gè)內(nèi)部類(lèi)繼承自AQS。為什么會(huì)這么設(shè)計(jì)而不是直接繼承呢?簡(jiǎn)而言之,鎖面向的是使用者,同步器面向的是線(xiàn)程控制,在鎖的實(shí)現(xiàn)中聚合同步器而不是直接繼承AQS很好的隔離了二者所關(guān)注的領(lǐng)域。
AbstractQueuedSynchronizer在內(nèi)部依賴(lài)一個(gè)雙向同步隊(duì)列來(lái)完成同步狀態(tài)的管理,當(dāng)前線(xiàn)程獲取同步狀態(tài)失敗時(shí),同步器會(huì)將該線(xiàn)程和等待狀態(tài)信息構(gòu)造成一個(gè)節(jié)點(diǎn)并將其加入到同步隊(duì)列中。Node節(jié)點(diǎn)以AQS的內(nèi)部類(lèi)存在,其字段屬性如下:
AbstractQueuedSynchronizer$Node | |
屬性 | 描述 |
volatile int waitStatus | 等待狀態(tài),并不是同步狀態(tài),而是在隊(duì)列中的線(xiàn)程節(jié)點(diǎn)等待狀態(tài)(Node節(jié)點(diǎn)中一共定義四種狀態(tài)) CANCELLED = 1 //線(xiàn)程由于超時(shí)或被中斷會(huì)被取消在隊(duì)列中的等待,被取消了的線(xiàn)程不會(huì)再被阻塞,即狀態(tài)不會(huì)再改變 SIGNAL = -1 //后繼節(jié)點(diǎn)處于等待狀態(tài),當(dāng)前節(jié)點(diǎn)釋放鎖或者取消等待時(shí)會(huì)通知后繼節(jié)點(diǎn) CONDITION = -2 //暫時(shí)忽略,涉及Condition 網(wǎng)友評(píng)論 |