Java 同步鎖ReentrantLock與抽象同步佇列AQS

2022-11-15 09:02:52

AbstractQueuedSynchronizer 抽象同步佇列,它是個模板類提供了許多以鎖相關的操作,常說的AQS指的就是它。AQS繼承了AbstractOwnableSynchronizer類,AOS用於儲存執行緒物件,儲存什麼執行緒物件呢?儲存鎖被獨佔的執行緒物件

抽象同步佇列AQS除了實現序列化標記介面,並沒有實現任何的同步介面,該類提供了許多同步狀態獲取和釋放的方法給自定義同步器使用,如ReentrantLock的內部類Sync。抽象同步佇列支援獨佔式或共用式的的獲取同步狀態,方便實現不同型別的自定義同步器。一般方法名帶有Shared的為共用式,比如,嘗試以共用式的獲取鎖的方法int tryAcquireShared(int),而獨佔式獲取鎖方法為boolean tryAcquire(int)

AQS是抽象同步佇列,其重點就是同步佇列如何操作同步佇列

同步佇列

雙向同步佇列,採用尾插法新增節點,從頭部的下一個節點獲取操作節點,節點自旋獲取同步鎖,實現FIFO(先進先出)原則。

理解節點中的屬性值作用

  • prev:前驅節點;即當前節點的前一個節點,之所以叫前驅節點,是因為前一個節點在使用完鎖之後會解除後一個節點的阻塞狀態;

  • next:後繼節點;即當前節點的後一個節點,之所以叫後繼節點,是因為「後繼有人」了,表示有「下一代」節點承接這個獨有的鎖