1. 程式人生 > >繼上篇後AQS簡要理解

繼上篇後AQS簡要理解

AQS詳解之前轉載過一篇優秀的博文,這篇是想總結一下便於理解。

AQS機制核心有兩個:

一是維護了一個記錄資源佔用狀態的statue,statue=0的時說明當前資源沒有被佔用,statue為N則說明當前資源被幾個執行緒佔用,用CAS機制去修改維護這個statue,所以AQS機制還是要依賴於CAS機制的。

二是維護了一個先進先出的CLH佇列,當執行緒競爭資源失敗時,就被park()並放入CLH佇列等待被喚醒即unpark()。

AQS全程是AbstractQueuedSynchronizer,即是一個抽象類,許多同步結構都是繼承AQS並重寫其抽象方法tryAcquire(int)/tryRelease(int)和tryAcquireShared(int)/tryReleaseShared(int)方法,以達到不同的共享資源statue的獲取和釋放方法,從而形成不同的同步結構。

AQS定義了兩種資源共享方式。

一是獨佔型,需要重寫tryAcquire(int)/tryRelease(int),例如Reentrantlock再入鎖。

二是共享型,需要重寫tryAcquireShared(int)/tryReleaseShared(int),例如CountDownLatch以及Semphore。

這裡有一個細節,為什麼將AQS設計成一個抽象類呢,因為繼承一個抽象類不用重寫其所有方法,即獨佔型鎖不需要重寫共享型鎖的方法了,反過來也是,這也是設計的巧妙之處。

除了上面提到的Reentrantlock、CountDownLatch以及Semphore,一般syn開頭的同步結構都是AQS的子類,有一個需要注意的是同步關鍵字synchronized不是基於AQS機制實現的,synchronized是基於CAS機制操作Mark Word即物件頭,涉及到偏斜鎖,鎖的升級降級,要區分一下。

還有一個容易模糊的地方,AQS機制和CAS機制不存在比較的關係,前面提到AQS機制是基於CAS機制實現的。如果非要比較,CAS機制是無鎖機制,AQS機制存在park()/unpark()阻塞喚醒執行緒,是有鎖的。