1. 程式人生 > 其它 >Java併發基礎(10)—— AQS

Java併發基礎(10)—— AQS

技術標籤:java併發java併發多執行緒

一、背景

之前我們學習了併發工具類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中,同樣使用了模板方法模式