Java併發基礎(10)—— AQS
阿新 • • 發佈:2021-01-12
一、背景
之前我們學習了併發工具類CountDownLatch、Semaphone等,還有可重入鎖ReentrantLock,讀寫鎖ReetrantReadWriteLock等
它們都提供了鎖的功能,只不過在實現最基本的鎖功能後,又提供了其他不同的功能
而它們最基本的鎖功能:都是使用AQS來實現
所以本節學習一下AbstractQueuedSynchronizer是如何來實現鎖功能的
二、模板方法模式
在學習AQS之前,我們先學習一下模板方法模式
模板方法模式:一個抽象類公開定義了執行它方法的模板,它的子類可以按照需要重寫方法的實現,但呼叫將以抽象類中定義的方式
假設從A地去B地有三種方式,坐汽車,坐火車,坐高鐵。無論哪種方式都需要進行買票,乘坐,到達三個步驟。這時我們就可以使用模板方法模式了
這裡注意區分模板方法,流程方法
直接看程式碼,比較好理解
父類FromAToB
public abstract class FromAToB { //買票(流程方法) public abstract void buyTicket(); //乘坐(流程方法) public abstract void ride(); //到達(流程方法) public abstract void arrive(); //其他通用的公共方法,由父類直接實現,子類無需重寫(流程方法) public void other() { System.out.println("看風景"); } //我們自己定義的模板方法 public void setOut() { buyTicket();//買票 ride();//乘坐 other();//看風景 arrive();//到達 } }
子類GoBuyTrain
public class GoBuyTrain extends FromAToB{ //子類重寫父類的流程方法 @Override public void buyTicket() { System.out.println("買火車票"); } //子類重寫父類的流程方法 @Override public void ride() { System.out.println("乘坐火車"); } //子類重寫父類的流程方法 @Override public void arrive() { System.out.println("到達目的地"); } public static void main(String[] args) { GoBuyTrain goBuyTrain = new GoBuyTrain(); goBuyTrain.setOut();//呼叫抽象類的模板方法 } }
執行結果
如果我們想實現通過汽車或火車的方式,同樣只需要實現父類的流程方法,然後呼叫對應的模板方法即可
三、AQS核心
在AQS中,同樣使用了模板方法模式