Jdk1.5中包含了并發(fā)大神Doug Lea寫的并發(fā)工具包java.util.concurrent,這個工具包中包含了顯示鎖和其他的實用同步組件。Doug Lea在構建鎖和組件的時候,大多是以隊列同步器(AbstractQueuedSynchronizer)為基礎的,因此AbstractQueuedSynchronizer可以看作是并發(fā)包的基礎框架。因此掌握了AbstractQueuedSynchronizer的實現(xiàn)原理,也就掌握了大多數(shù)并發(fā)組件的實現(xiàn)原理。
AbstractQueuedSynchronizer使用一個int變量state表示同步狀態(tài),使用一個隱式的FIFO隊列(隱式隊列就是并沒有聲明這樣一個隊列,只是通過每個節(jié)點記錄它的上個節(jié)點和下個節(jié)點來從邏輯上產生一個隊列)來完成阻塞線程的排隊。
AQS是一個抽象類,當我們要構建一個同步組件的時候,需要定義一個子類繼承AQS,這里應用了模板方法設計模式,這里簡單回顧一下模板模式:
模板模式由一個抽象類和一個實現(xiàn)類組成,抽象類中主要有三類方法: 模板方法:實現(xiàn)了算法主體框架,供外部調用。里面會調用原語操作和鉤子操作。 原語操作:即定義的抽象方法,子類必須重寫。 鉤子操作:和原語操作類似,也是供子類重寫的,區(qū)別是鉤子操作子類可以選擇重寫也可以選擇不重寫,如果不重寫則使用抽象類默認操作,通常是一個空操作或拋出異常。
在AQS中沒有原語操作,也就是說自定義的子類繼承AQS后,不會強制子類重寫任何方法。AQS只提供了若干鉤子操作,這些鉤子操作的默認實現(xiàn)都是直接拋出異常。子類不需要重寫所有的鉤子操作,只需要根據(jù)要構建的同步組件的類型來決定要調用AQS中的哪些模板方法,再實現(xiàn)這些模板方法中用到了的鉤子操作即可。
AQS中可供子類重寫的鉤子操作有:
方法名稱 | 描述 |
boolean tryAcquire(int arg) | 獨占式獲取同步狀態(tài),成功返回true,失敗返回false。 |
boolean tryRelease(int arg) | 獨占式釋放同步狀態(tài),成功返回true,失敗返回false。 |
網友評論 |