多線程第五節_AQS


### 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是原來的變種,線程由自旋改爲阻塞

1655973164617

1.5 條件等待隊列

	Condition是一個多線程間協調通信的工具類,使得某些線程一起等待條件,只有具備該條件這些線程纔會被喚醒重新爭奪鎖

1655973360331

1.6 AQS源碼分析

1655977751646

1655977818317

1655977890407

1655977958527

1655978038032

1655978101903

1655978168467

1655978206333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章