電子商務網站開發(fā)是什么官方正版清理優(yōu)化工具
系列文章目錄
設計模式之避免共享的設計模式Immutability(不變性)模式
設計模式之并發(fā)特定場景下的設計模式 Two-phase Termination(兩階段終止)模式
設計模式之避免共享的設計模式Copy-on-Write模式
設計模式之避免共享的設計模式 Thread-Specific Storage 模式
設計模式之多線程版本的if------Guarded Suspension模式
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 系列文章目錄
- 簡介
- 與Guarded Suspension對比
- 應用場景
- 如何實現Balking模式
- 樣例
簡介
- Balking是“退縮不前”的意思。
- 如果現在不適合執(zhí)行這個操作,或者沒必要執(zhí)行這個操作,就停止處理,直接返回。當流程的執(zhí)行順序依賴于某個共享變量的場景,可以歸納為多線程if模式。Balking模式常用于一個線程發(fā)現另一個線程已經做了某一件相同的事,那么本線程就無需再做了,直接結束返回。
- Balking模式是一種多個線程執(zhí)行同一操作時可以考慮的模式;在
線程2
被阻塞
或者執(zhí)行其他操作
時,線程1
同樣可以完成操作,而當線程2執(zhí)行或者繼續(xù)執(zhí)行
操作時,因為操作已被執(zhí)行過了,而無需線程2再執(zhí)行,從而提升線程2的執(zhí)行效率。
與Guarded Suspension對比
Balking模式和Guarded Suspension模式一樣,存在守護條件,如果守護條件不滿足,則中斷處理;這與Guarded Suspension模式不同,Guarded Suspension模式在守護條件不滿足的時候會一直等待至可以運行。
應用場景
- sychronized輕量級鎖膨脹邏輯
- 初始狀態(tài):某個線程嘗試進入同步塊時,如果該同步塊沒有被其他線程占用,并且此時不存在競爭,Java 虛擬機會將該同步塊的對象頭 Mark Word 的部分記錄下來作為該線程的鎖記錄(Lock Record)。
- 競爭狀態(tài):當其他線程也嘗試進入同步塊,而此時存在競爭時,輕量級鎖會膨脹為重量級鎖。重量級鎖的實現通常會涉及到操作系統(tǒng)底層的線程阻塞和喚醒機制,它會使得持有該鎖的線程阻塞而不是自旋等待。
- 膨脹過程:膨脹的過程中,Java 虛擬機會將原來記錄在對象頭的鎖記錄替換為指向重量級鎖的指針,這樣當其他線程嘗試獲取該鎖時就會轉變?yōu)橹亓考夋i的獲取和釋放邏輯。
- DCL單例實現
DCL(Double-Checked Locking)是一種單例模式的實現方式,它通過雙重檢查(即在加鎖前后都檢查是否已經創(chuàng)建實例)來提高單例模式的性能。
- 服務組件的初始化
- 配置加載:加載服務組件所需的配置信息,例如數據庫連接信息、緩存配置、日志配置等。這可以通過讀取配置文件、從外部服務獲取配置等方式來實現。
- 資源分配和初始化:根據配置信息,初始化服務組件所需的資源,例如數據庫連接池、線程池、緩存對象等。確保資源能夠正確分配和初始化,并達到可用狀態(tài)。
- 依賴注入:如果服務組件依賴于其他組件或對象,需要進行依賴注入,即將依賴的對象注入到服務組件中,以便服務組件能夠正常運行。
- 啟動服務:啟動服務組件,使其處于可用狀態(tài),可以接受外部請求并提供相應的功能。
- 執(zhí)行其他初始化邏輯:根據具體需求,執(zhí)行其他必要的初始化邏輯,例如預加載數據、初始化定時任務等。
如何實現Balking模式
- 鎖機制 (synchronized reentrantLock)
- cas
- 對于共享變量不要求原子性的場景,可以使用volatile
樣例
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @author yang* @version 1.0.0*/
public class BalkingExample {private boolean jobInProgress = false;private final Lock lock = new ReentrantLock();public void doJob() {if (lock.tryLock()) {try {if (jobInProgress) {System.out.println("工作已經在進行中,返回...");return; // 另一個線程已經在執(zhí)行該操作,無需再執(zhí)行}jobInProgress = true;System.out.println("執(zhí)行...");// 執(zhí)行需要做的工作} finally {jobInProgress = false; // 完成工作后將jobInProgress設置為falselock.unlock();}} else {System.out.println("另一個線程當前正在執(zhí)行該作業(yè), 返回...");}}public static void main(String[] args) {BalkingExample balkingExample = new BalkingExample();// 創(chuàng)建多個線程調用doJob方法for (int i = 0; i < 5; i++) {Thread thread = new Thread(() -> {balkingExample.doJob();});thread.start();}}
}