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