并發設計模式實戰系列(10):Balking(猶豫模式)

🌟 大家好,我是摘星! 🌟

今天為大家帶來的是并發設計模式實戰系列,第10章Balking(猶豫模式),廢話不多說直接開始~

目錄

一、核心原理深度拆解

1. 狀態守護機制

2. 與狀態模式的區別

二、生活化類比:自動售貨機

三、Java代碼實現(生產級Demo)

1. 完整可運行代碼

2. 關鍵實現技術

四、橫向對比表格

1. 相似模式對比

2. 線程安全方案選擇

五、高級應用技巧

1. 組合模式增強

2. 日志增強實現

3. Spring應用場景

六、Balking模式變體與擴展(續)

1. 分布式場景下的Balking

2. 分級Balking策略

七、性能優化與陷阱規避

1. 狀態檢查的性能優化

2. 常見陷阱與解決方案

八、工業級應用案例

1. Tomcat連接器中的Balking

2. 電商庫存扣減場景

九、與其他模式的組合應用

1. Balking + Observer 模式

2. Balking + Chain of Responsibility

十、終極對比表格:Balking模式家族


一、核心原理深度拆解

1. 狀態守護機制

┌───────────────┐       ┌───────────────┐
│   Client      │──────>│   GuardedObj   │
└───────────────┘       ├───────────────┤│ - state       ││ - checkState()││ - changeState() └───────────────┘
  • 狀態檢查:通過原子操作驗證對象是否處于可處理狀態
  • 條件攔截:當狀態不滿足時立即放棄操作(Balking)
  • 線程安全:所有狀態變更必須加鎖(synchronized或CAS)

2. 與狀態模式的區別

  • Balking:直接放棄不符合條件的請求(快速失敗)
  • State Pattern:將行為委托給不同狀態對象處理

二、生活化類比:自動售貨機

系統組件

現實類比

核心行為

Client

顧客投幣

發起購買請求

checkState

貨品檢測系統

檢查庫存和金額是否充足

Balking

退幣機制

條件不滿足時立即退幣

  • 典型場景:當檢測到「缺貨」或「金額不足」時,立即終止交易流程

三、Java代碼實現(生產級Demo)

1. 完整可運行代碼

import java.util.concurrent.atomic.*;// 帶Balking模式的文件自動保存
public class AutoSaveEditor {// 狀態標記(原子操作)private final AtomicBoolean changed = new AtomicBoolean(false);private final AtomicInteger autoSaveCount = new AtomicInteger(0);// 狀態守護方法public void autoSave() {// STEP 1: 狀態檢查if (!changed.getAndSet(false)) {System.out.println("[Balking] 無修改不保存");return; // 快速返回}// STEP 2: 實際保存操作doSave();}// 修改內容后觸發狀態變更public void editDocument(String newContent) {System.out.println("編輯內容: " + newContent);changed.set(true);}private void doSave() {System.out.println("自動保存第" + autoSaveCount.incrementAndGet() + "次...");// 模擬IO操作try { Thread.sleep(500); } catch (InterruptedException e) {}}// 測試用例public static void main(String[] args) throws InterruptedException {AutoSaveEditor editor = new AutoSaveEditor();// 第一次修改(應觸發保存)editor.editDocument("Version1");editor.autoSave();// 連續修改不保存(狀態被消費)editor.editDocument("Version2");editor.editDocument("Version3");editor.autoSave(); // 只會保存一次// 無修改情況editor.autoSave();}
}

2. 關鍵實現技術

// 1. 原子狀態標記
private final AtomicBoolean changed = new AtomicBoolean(false);// 2. 狀態檢查與重置一體化操作
changed.getAndSet(false) // 3. 線程安全計數器
autoSaveCount.incrementAndGet()

四、橫向對比表格

1. 相似模式對比

模式

核心策略

適用場景

Balking

條件不滿足立即放棄

狀態校驗場景(如自動保存)

Retry

條件不滿足循環重試

網絡請求等可恢復場景

State

委托給狀態對象處理

復雜狀態轉換場景

Guard Suspension

等待條件滿足

必須完成的阻塞任務

2. 線程安全方案選擇

實現方式

優點

缺點

synchronized

簡單可靠

性能開銷較大

AtomicXXX

無鎖高性能

只適用于簡單狀態

ReentrantLock

可中斷/超時

需手動釋放鎖

volatile

輕量級可見性保證

不保證復合操作原子性


五、高級應用技巧

1. 組合模式增強

// 結合Guard Suspension模式實現超時控制
public boolean autoSaveWithTimeout(long timeout) throws InterruptedException {long start = System.currentTimeMillis();while (!changed.get()) {if (System.currentTimeMillis() - start > timeout) {return false; // 超時放棄}Thread.sleep(50);}return doSave();
}

2. 日志增強實現

// 記錄Balking事件
if (!changed.get()) {auditLogger.log("Balking at " + LocalDateTime.now());return;
}

3. Spring應用場景

@Component
public class ConfigMonitor {@Scheduled(fixedRate = 5000)public void reloadConfig() {if (!GlobalConfig.isDirty()) {return; // Balking}// 重新加載配置...}
}

好的!我將延續原有結構,從 第六部分 開始擴展Balking模式的深度內容,保持技術解析的連貫性和完整性。


六、Balking模式變體與擴展(續)

1. 分布式場景下的Balking

// 使用Redis實現分布式狀態標記
public class DistributedBalking {private final Jedis jedis;private static final String LOCK_KEY = "resource:lock";public boolean tryProcess(String resourceId) {// SETNX實現原子狀態檢查(分布式鎖原理)Long result = jedis.setnx(LOCK_KEY, "locked");if (result == 0) {System.out.println("[Distributed Balking] 資源已被占用");return false;}jedis.expire(LOCK_KEY, 30);return true;}
}

關鍵點

  • 使用Redis的SETNX命令替代本地原子變量
  • 需設置過期時間避免死鎖
  • 適用于微服務搶單、定時任務調度等場景

2. 分級Balking策略

// 根據業務重要性實現分級放棄
public class PriorityBalking {private enum Priority { HIGH, NORMAL, LOW }public void process(Priority priority) {if (!checkResource()) {if (priority == Priority.LOW) {System.out.println("低優先級任務放棄");return;}// 高優先級任務等待資源waitForResource();}// 執行處理...}
}

七、性能優化與陷阱規避

1. 狀態檢查的性能優化

優化手段

實現方式

適用場景

雙重檢查鎖

先非阻塞檢查,再同步塊內二次檢查

高并發讀場景

狀態標記分組

對不同資源分桶標記

多資源競爭場景

延遲狀態重置

處理完成后再重置狀態(減少CAS競爭)

短時高頻狀態變更

// 雙重檢查鎖實現示例
public class DoubleCheckBalking {private volatile boolean busy = false;public void execute() {if (!busy) {  // 第一次非阻塞檢查synchronized (this) {if (!busy) {  // 第二次原子檢查busy = true;// 執行任務...busy = false;}}}}
}

2. 常見陷阱與解決方案

陷阱現象

根本原因

解決方案

活鎖(Livelock)

多個線程持續檢查-放棄循環

引入隨機退避時間

狀態逃逸

對象引用被外部修改

防御性拷貝(Deep Copy)

監控缺失

無法追蹤放棄操作次數

添加Metrics計數器


八、工業級應用案例

1. Tomcat連接器中的Balking

// org.apache.tomcat.util.net.AbstractEndpoint
public boolean processSocket(SocketWrapperBase<S> socket) {if (running && !paused) {// 將socket交給線程池處理return executor.execute(new SocketProcessor(socket));}// 服務未運行立即放棄return false; 
}

設計啟示

  • 通過runningpaused雙狀態判斷
  • 放棄時直接關閉Socket連接釋放資源

2. 電商庫存扣減場景

public class InventoryService {private final AtomicInteger stock = new AtomicInteger(100);public boolean deductStock(int quantity) {int current = stock.get();if (current < quantity) {// 庫存不足立即返回metrics.log("balking:insufficient_stock"); return false;}// CAS原子扣減return stock.compareAndSet(current, current - quantity);}
}

九、與其他模式的組合應用

1. Balking + Observer 模式

public class ConfigMonitor {private final List<Listener> listeners = new CopyOnWriteArrayList<>();private volatile String currentConfig;// 配置變更通知(Balking條件檢查)public void updateConfig(String newConfig) {if (Objects.equals(currentConfig, newConfig)) {return; // 配置未變化時放棄}this.currentConfig = newConfig;notifyListeners();}
}

2. Balking + Chain of Responsibility

public abstract class OrderHandler {private OrderHandler next;public void handle(Order order) {if (canHandle(order)) {// 實際處理邏輯...} else if (next != null) {next.handle(order);} else {// 責任鏈終止時的Balkingorder.fail("NO_HANDLER_FOUND");}}protected abstract boolean canHandle(Order order);
}

十、終極對比表格:Balking模式家族

變體名稱

核心差異點

典型應用場景

Java SDK中的體現

經典Balking

基于本地原子變量

單機資源控制

AtomicBoolean.getAndSet

分布式Balking

依賴外部存儲狀態

跨服務協調

Redis SETNX

分級Balking

按優先級差異化處理

業務流量分級

ThreadPoolExecutor拒絕策略

延遲Balking

超時后才放棄

弱依賴服務調用

Future.get(timeout)

批量Balking

累積多個請求后統一判斷

批量處理系統

BufferedWriter.flush

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78024.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【強化學習系列】貝爾曼方程

首先回顧狀態價值函數和動作價值函數的定義&#xff1a; 狀態價值函數 v π ( s ) v_\pi(s) vπ?(s)是從狀態 s s s出發&#xff0c;直至一幕結束后獲得的回報的期望值 動作價值函數 q π ( s , a ) q_\pi(s,a) qπ?(s,a)是從狀態 s s s出發&#xff0c;采取動作 a a a后&…

donet使用指定版本sdk

ps:來自微軟官方方案,實測可行,就是在項目任意目錄下在新建 global.json,并配置sdk版本 SDK 使用最新安裝的版本 SDK 命令包括 dotnet new 和 dotnet run。 .NET CLI 必須為每個 dotnet 命令選擇一個 SDK 版本。 即使在以下情況下&#xff0c;它也會默認使用計算機上安裝的最新…

x-cmd install | Orbiton:極簡至上的終端文本編輯器與輕量級 IDE

目錄 核心特點安裝適用場景優勢 厭倦了臃腫復雜的 IDE&#xff1f;渴望一個輕巧、快速、專注的編碼環境&#xff1f;Orbiton&#xff0c;一款極簡主義的終端文本編輯器與輕量級 IDE&#xff0c;將帶給你前所未有的編碼體驗。 核心特點 極簡主義&#xff0c;專注編碼&#xff1…

大腦、機器人與貝葉斯信念及AI推理

在機器不再局限于重復性任務的世界里&#xff0c;機器人技術已經大膽地邁入了感知、學習和決策的領域。這篇文章探討了智能機器人系統是如何構建的——從理解它們嘈雜的傳感器和不確定的環境&#xff0c;到使它們能夠做出明智的選擇并隨著時間的推移調整自己的行為。 AI推理 …

線上婚戀相親小程序源碼介紹

?基于ThinkPHP、FastAdmin和UniApp開發的線上婚戀相親小程序源碼&#xff0c;這款小程序源碼采用了ThinkPHP作為后端框架&#xff0c;其強大的功能與良好的擴展性為程序的穩定運行提供了保障。 ?FastAdmin作為后臺管理框架&#xff0c;使得管理員能夠便捷地對用戶信息、相親…

長短期記憶(LSTM)簡介

RNN 的主要限制在于它無法記住很長的序列&#xff0c;并且會陷入梯度消失的問題。 什么是梯度消失問題&#xff1f; 當添加更多具有某些激活函數的層時&#xff0c;神經網絡中損失函數的梯度趨近于零&#xff0c;這使得網絡難以訓練。 長短期記憶&#xff08;LSTM&#xff09;…

JESD204B 探究

JESD204B協議是高速串行接口標準,主要用于ADC/DAC與邏輯器件(如FPGA)之間的數據傳輸。以下為綜合解析: 一、協議概述 ?核心作用? 通過高速SERDES技術實現數模轉換器與邏輯器件間的高效數據傳輸,支持多通道同步和確定性延遲,適用于GB級吞吐量場景23。?版本演進? JESD2…

Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自動進入PIP Mode

接上文 Flutter PIP 插件 ---- Android 項目地址 PIP&#xff0c; pub.dev也已經同步發布 pip 0.0.3&#xff0c;你的加星和點贊&#xff0c;將是我繼續改進最大的動力 開發文檔 Add videos using picture-in-picture (PiP)介紹PIP功能從 Android 8.0 (API level 26) 引入&…

【Java開發日記】6個Java 工具,輕松分析定位 JVM 問題 !

目錄 使用 JDK 自帶工具查看 JVM 情況 jps jinfo jvisualvm jcm 使用 JDK 自帶工具查看 JVM 情況 JDK 自帶了很多命令行甚至是圖形界面工具&#xff0c;幫助查看 JVM 的一些信息。比如&#xff0c;在機器上運行 ls 命令&#xff0c;可以看到 JDK 8 提供了非常多的工具或程…

動態規劃簡單題2

leetcode91題&#xff08;解碼方法&#xff09; 分析題目&#xff1a; 1.這是一種解碼&#xff0c;就是給多個數字組成的字符串&#xff0c;把這些數字解碼成字母&#xff0c;看看一共有多少種 2.如果一個數字前有前導0就不合法&#xff0c;比如06&#xff0c;這與6不同&…

(007)Excel 公式的使用

文章目錄 邏輯運算公式的參數常用函數引用方式引用工作表和工作簿表格的引用修改公式的計算時機區域交叉引用 邏輯運算 公式的參數 單元格引用&#xff1a;SUM(A1:A24)。字面值&#xff1a;SQRT(121)。字面文本字符串&#xff1a;PROPER(“john.f.smith”)。表達式&#xff1a…

Unity 和 Unreal Engine(UE) 兩大主流游戲引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 兩大主流游戲引擎的核心使用方法和對比分析&#xff0c;幫助開發者快速上手并根據項目需求選擇合適工具&#xff1a; 一、Unity 使用指南 1. 安裝與配置 安裝&#xff1a;從 Unity Hub 下載&#xff0c;選擇長期支持…

猜數字游戲:從數學原理到交互體驗的完整設計指南

目錄 猜數字游戲&#xff1a;從數學原理到交互體驗的完整設計指南引言第一章 游戲數學原理1.1 均勻分布與隨機生成1.2 最優猜測策略 第二章 游戲系統設計2.1 核心架構2.2 動態難度系統 第三章 交互設計細節3.1 輸入驗證系統3.2 漸進式提示機制 第四章 進階功能設計4.1 智能輔導…

2025工業大模型白皮書 | 螞蟻工廠北京航空航天大學聯合出品

由螞蟻工廠與北京航空航天大學聯合發布的《2025工業大模型白皮書》是一部針對工業領域大模型技術發展的前瞻性研究報告。該白皮書系統梳理了工業大模型的技術演進、核心應用場景、關鍵挑戰及未來發展趨勢&#xff0c;旨在為制造業數字化轉型提供理論支撐和實踐指南。作為產學研…

JavaWeb:后端web基礎(TomcatServletHTTP)

一、今日內容 二、Tomcat 介紹與使用 介紹 基本使用 小結 配置 配置 查找進程 三、Servlet 什么是Servlet 快速入門 需求 步驟 1.新建工程-模塊&#xff08;Maven&#xff09; 2.修改打包方式-war 3.編寫代碼 /*** 可以選擇繼承HttpServlet*/ WebServlet("/hello&q…

構建現代分布式云架構的三大支柱:服務化、Service Mesh 與 Serverless

目錄 前言1. 服務化架構模式&#xff1a;構建可擴展的基礎單元1.1 服務化的定義與演進1.2 在分布式云中的價值1.3 面臨的挑戰 2. Service Mesh 架構&#xff1a;服務通信的治理中樞2.1 什么是 Service Mesh&#xff1f;2.2 功能與優勢2.3 在分布式云中的角色2.4 落地難點 3. Se…

嵌入式C語言的運算符與輸入輸出

目錄 1. 運算符 1.1 位運算符 1.1.1 位運算 ~ 1.1.2 位邏輯與 & 1.1.3 位邏輯或 | 1.1.4 位邏輯異或 ^ 1.1.5 位移位運算 1.1.6 將無符號位的某位快速置 1 1.2 三目運算符 1.3 逗號運算符 1.4 運算符優先級 2. 輸出 2.1 字符輸出函數 2.2 格式輸出函數 2.3 字符…

IPD研學:76頁頁基于IPD思想-華為需求管理培訓方案【附全文閱讀】

適應人群 本方案適用于企業中參與產品研發、市場、銷售、項目管理等部門的人員,尤其是負責需求管理工作的相關從業者;致力于提升產品競爭力,對優化需求管理流程、提高產品開發質量感興趣的企業管理者;以及希望了解行業前沿需求管理方法,尋求突破和創新的相關人士。…

米酒的功能和優缺點

米酒&#xff08;又稱甜酒、酒釀&#xff09;是一種以糯米或其他谷物為原料&#xff0c;經發酵制成的傳統發酵飲品&#xff0c;酒精度較低&#xff08;通常1%-10%&#xff09;。以下是其功能、優點及缺點分析&#xff1a; 一、米酒的功能 營養補充 富含B族維生素&#xff08;B1…

注冊登錄頁面項目

關系型數據庫地址&#xff1a;C:\Users\ASUS\AppData\Local\Temp\HuaweiDevEcoStudioDatabases\rdb #注冊頁面register.ets import dataRdb from ohos.data.rdbconst STORE_CONFIG {name: weather4.db } const TABLE_NAME weather_info const SQL_CREATE_TABLE CREATE TAB…