喫透Java併發九:locks之AbstractQueuedSynchronizer(AQS)

一、AQS綜述

AbstractQueuedSynchronizer抽象類(以下簡稱AQS)是整個java.util.concurrent包的核心。在JDK1.5時,Doug Lea引入了J.U.C包,該包中的大多數同步器都是基於AQS來構建的。AQS框架提供了一套通用的機制來管理同步狀態(synchronization state)、阻塞/喚醒線程、管理等待隊列。

我們所熟知的ReentrantLock、CountDownLatch、CyclicBarrier等同步器,其實都是通過內部類實現了AQS框架暴露的API,以此實現各類同步器功能。這些同步器的主要區別其實就是對同步狀態(synchronization state)的定義不同。

AQS框架,分離了構建同步器時的一系列關注點,它的所有操作都圍繞着資源——同步狀態(synchronization state)來展開,並替用戶解決了如下問題:

  • 資源是可以被同時訪問?還是在同一時間只能被一個線程訪問?(共享/獨佔功能)
  • 訪問資源的線程如何進行併發管理?(等待隊列)
  • 如果線程等不及資源了,如何從等待隊列退出?(超時/中斷)

這其實是一種典型的模板方法設計模式:父類(AQS框架)定義好骨架和內部操作細節,具體規則由子類去實現。AQS框架將剩下的一個問題留給用戶:什麼是資源?如何定義資源是否可以被訪問?
我們來看下幾個常見的同步器對這一問題的定義:

同步器 資源的定義
ReentrantLock 資源表示獨佔鎖。State爲0表示鎖可用;爲1表示被佔用;爲N表示重入的次數
ReentrantReadWriteLock 資源表示共享的讀鎖和獨佔的寫鎖。state邏輯上被分成兩個16位的unsigned short,分別記錄讀鎖被多少線程使用和寫鎖被重入的次數。
CountDow
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章