首頁技術文章正文

Java AQS是什么?如何理解AQS?

更新時間:2020-12-08 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif

AQS(AbstractQueuedSynchronizer類)是一個用來構建鎖和同步器的框架,各種Lock包中的鎖(常用的有Reentrantlock、ReadWritelock),以及其他如 Semaphore、CountDownlatch,甚至是早期的FutureTask等,都是基于AQS來構建。


1.AQS在內(nèi)部定義了一個volatile int state變量,表示同步狀態(tài):當線程調(diào)用lock方法時,如果state=0,說明沒有任何線程占有共享資源的鎖,可以獲得鎖并將state=1;如果state=1,則說明有線程目前正在使用共享變量,其他線程必須加入同步隊列進行等待。


2.AQs通過Node內(nèi)部類構成的一個雙向鏈表結構的同步隊列,來完成線程獲取鎖的排隊工作,當有線程獲取鎖失敗后,就被添加到隊列未尾。

·Node類是對要訪問同步代碼的線程的封裝,包含了線程本身及其狀態(tài)叫Waitstatus(有五種不同取值,分別表示是否被阻塞,是否等待喚醒,是否已經(jīng)被取消等),每個Noe結點關聯(lián)其prev結點和next結點,方便線程釋放鎖后快速喚醒下一個在等待的線程,是一個FIFO的過程。

·Node類有兩個常量,SHARED和CLUSIVE,分別代表共享模式和獨占模式。所謂共亨模式是一個鎖允許多條線程同時操作(信號量Semaphore就是基于A○S的共享模式實現(xiàn)的),獨占模式是同一個時間段只能有一個線程對共享資源進行操作,多余的請求線程需要排隊等待(如ReentranLock)。


3.AQS通過內(nèi)部類Conditionobject構建等待隊列(可有多個),當Condition調(diào)用Wat()方法后,線程將會加入等待隊列中,而當Condition調(diào)用signal()方法后,線程將從等待隊列轉移動同步隊列中進鎖竟爭。


4.AQS和Condition各自維護了不同的隊列,在使用Lock和Condition的時候,其實就是兩個隊列的互相移動。


猜你喜歡:

Spring Cloud Hystrix原理詳細介紹

openresty安裝使用教程

Java中final關鍵字如何使用?

Java高級軟件工程師培訓課程

分享到:
在線咨詢 我要報名
和我們在線交談!