1.單例模式
1. ??餓漢式(Eager Initialization)??
??核心原理??:類加載時立即創建實例,通過靜態變量直接初始化。
??代碼示例??:
public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有構造public static Singleton getInstance() {return INSTANCE;}
}
??特點??:
? ??線程安全??:JVM 類加載機制保證唯一實例。
? ??非延遲加載??:實例在類加載時創建,若未被使用則浪費資源。
??適用場景??:實例小、啟動時即需使用的場景(如配置管理器)
2. ??懶漢式(Lazy Initialization)??
(1) 基礎版(線程不安全)
??代碼示例??:
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 多線程下可能重復創建}return instance;} }
??問題??:多線程并發時可能創建多個實例
3. ??雙重檢查鎖(Double-Checked Locking, DCL)?
? ? ?volatile在DCL中的兩個核心作用:禁止指令重排序和保證內存可見性?
??核心優化??:減少同步次數,兼顧性能與線程安全。
??代碼示例??:
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
關鍵點??:
? ??延遲加載??:實例在首次調用時創建。
? ??高效同步??:僅首次創建時加鎖。
?? ??需 volatile??:防止指令重排序導致未初始化對象被使用(JDK 1.5+ 生效)
4. ??靜態內部類(Static Inner Class)??
??原理??:利用 JVM 類加載機制,內部類首次調用時才加載并初始化實例。
??代碼示例??:
public class Singleton {private Singleton() {}private static class Holder {static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;}
}
點??:
? ??線程安全??:類加載過程由 JVM 保證同步。
? ??延遲加載??:無額外同步開銷。
??局限??:無法通過參數初始化實例
2.生產者-消費者模式
生產者-消費者模式是一種經典的并發設計模式,用于解決生產者和消費者線程之間的資源協作問題。其核心是??通過共享緩沖區(BlockingQueue)解耦生產與消費邏輯??,平衡兩者的處理速度差異。以下是該模式的實現方式、關鍵要點及最佳實踐
1.核心實現方式??
1. ??基礎版:wait()/notifyAll()
??
通過?synchronized
塊和?wait()/notifyAll()
手動控制線程協作
public class Buffer {private Queue<Integer> queue = new LinkedList<>();private int capacity = 10;public synchronized void produce(int value) throws InterruptedException {while (queue.size() == capacity) { // 緩沖區滿時等待wait();}queue.offer(value);notifyAll(); // 喚醒所有等待線程}public synchronized int consume() throws InterruptedException {while (queue.isEmpty()) { // 緩沖區空時等待wait();}int value = queue.poll();notifyAll(); // 喚醒生產者return value;}
}
2.核心組件與原理??
??生產者??
負責生成數據(如網絡請求結果、傳感器數據)并存入緩沖區。
當緩沖區滿時,生產者線程自動阻塞(避免資源浪費)。
??消費者??
從緩沖區取出數據并處理(如更新 UI、保存到數據庫)。
當緩沖區空時,消費者線程自動阻塞(避免空轉)。
??緩沖區??
作為數據中轉站,通常用??線程安全隊列??實現(如?
BlockingQueue
)。特性:容量限制、線程安全的存取操作(
put()
/take()
)。
??同步機制??
確保生產者和消費者不會同時操作緩沖區導致數據競爭(如隊列空/滿時的阻塞喚醒)
3.Android 典型應用場景??
??異步任務管理??
生產者:后臺線程下載圖片 → 消費者:主線程更新 UI。
示例:
HandlerThread
+?Handler
實現任務隊列(生產者投遞任務,Looper
消費任務)。
??數據流處理??
生產者:攝像頭采集幀 → 消費者:子線程進行圖像識別。
??高并發請求控制??
限制同時處理的網絡請求數量(如線程池任務隊列。
??跨進程通信??
通過?
IntentService
或?WorkManager
實現后臺任務生產與消費
3.工廠模式
1. ??簡單工廠模式(靜態工廠)??
??核心??:一個工廠類根據參數創建不同對象。
??Android應用??:
BitmapFactory
:通過decodeResource()
、decodeFile()
等方法,根據資源類型自動創建Bitmap
,隱藏JPEG/PNG等格式的解碼細節。??通知創建??:統一工廠根據類型生成不同樣式通知(如基礎通知、大圖通知)。
?2. ??工廠方法模式(子類決策)??
??核心??:定義抽象工廠接口,由子類實現具體對象創建。
??Android應用??:
LayoutInflater
:系統通過
onCreateView()
抽象方法,讓子類決定如何創建View。??自定義場景??:通過
setFactory2()
替換系統控件(如全局將TextView
替換為AppCompatTextView
),實現兼容性適配。
??RecyclerView??:
onCreateViewHolder()
由子類決定創建哪種ViewHolder
,解耦視圖類型與適配器邏輯。
?3. ??抽象工廠模式(產品家族)??
??核心??:創建一組相關對象(如整套UI組件)。
??Android應用??:
Resources
體系:根據設備配置(分辨率、語言)自動加載匹配的Drawable
、字符串等資源,不同ResourcesImpl
生產當前環境所需的資源家族。??主題切換??:為深色/淺色模式提供配套的按鈕、文本框等UI組件。
? 4. ??開源框架中的應用??
??Retrofit??:
Converter.Factory
根據接口返回類型選擇數據解析器(如GsonConverterFactory
)。??Glide??:
ModelLoaderFactory
根據數據類型(URL、File等)創建對應的資源加載器