### 1. AQS應用之lock
#### 1.1 併發之父
```java
doug lea(李二狗),併發之父;
java併發編程核心在於juc,當中的大部分同步器實現都是圍繞共同的基礎行爲,比如等待隊列,條件隊列,獨佔獲取,共享獲取等,而這個行爲的抽象就是基於AQS(abstractQueueSychronize),AQS定義了一套多線程訪問共享資源的同步框架,是一個依賴狀態的同步器
1.2 reentrantlock
reentrantlock是基於aqs框架實現的,是類似於synchronized的一種互斥鎖,可以保證線程安全。而且它具有手動加鎖和解鎖,支持加鎖的公平性。
它的特性:
1. reentrantlock實現了公平與非公平鎖
2. 內部定義了sync的內部類,該類繼承了AQS,對該抽象類的部分方法做了實現,並定義了倆個子類fairSync,NonfairSync;這倆個類繼承了Sync
3. 涉及到的是寂寞時:模板模式-子類根據需要做具體的業務實現
1.3 AQS具備特性
阻塞等待隊列;
共享、獨佔
公平、非公平
可重入
允許中斷
AQS內部維護屬性Volatile int state
表示資源的可用狀態
state的三種訪問方式
getState() setState() compareAndSetState()
AQS定義倆種資源共享方式
Exclusive-獨佔
share-共享
AQS定義的倆種隊列
同步等待隊列
條件等待隊列
不同的自定義同步器爭用共享資源的方式不同,自定義同步器在實現時只需要實現共享資源state的獲取與釋放即可,至於具體線程等待隊列的維護(如獲取資源失敗入隊、喚醒出隊),AQS在頂層已經實現好了。自定義同步器實現時主要實現一下方法:
1. isHeldExclusively():該線程是否正在獨佔資源。只有用到condition才需要去實現它
2. tryAcquire():獨佔方式。嘗試獲取資源
3. tryRelease:獨佔方式,嘗試釋放資源
4. tryAcquireShared:共享方式,嘗試獲取資源,負數表示失敗,0表示成功但沒有剩餘資源可用,正數表示成功且有剩餘資源
5. tryReleaseShared:共享方式。嘗試釋放資源,如果釋放後允許喚醒後續等待節點返回true,否則返回false
1.4同步等待隊列
AQS當中的同步等待隊列也叫clh隊列,一種基於雙向鏈表數據結構的隊列,是fifo線程等待隊列,Java中的clh是原來的變種,線程由自旋改爲阻塞
1.5 條件等待隊列
Condition是一個多線程間協調通信的工具類,使得某些線程一起等待條件,只有具備該條件這些線程纔會被喚醒重新爭奪鎖
1.6 AQS源碼分析