[Java基礎-線程篇]7_線程設計模式與總結

摘要:懶漢單例模式怎么變得線程安全?Master-Worker歸并模式,工作竊取算法。Java線程相關源碼使用了什么設計模式?

資料引用:《Java高并發核心編程·卷2》

目錄

線程安全的單例模式

Master-Worker模式

工作竊取算法

并發總結

線程篇歸納

Thread

JUC

異步

代碼質量

模式總結


線程安全的單例模式

懶漢模式,即調用才創建的單例模式在高并發情況下,會有多個單例的情況。
解決方案-雙重校驗+volatile:
檢查是否已經創建——>加鎖創建過程——>創建前判斷是否已經創建
第二次檢查主要是防止其他線程已經通過第一次檢查等待獲取鎖。
volatile關鍵字禁止實例創建過程中的指令重排。
/*** 雙重檢查鎖,解決多線程可能出現的多實例問題*/
public class SingleTon2 {private static volatile SingleTon2 singleton;private SingleTon2() {}public static SingleTon2 getInstance() {if (singleton == null) {synchronized (SingleTon2.class) {if (singleton == null) {singleton = new SingleTon2();}}}return singleton;}//類中其他方法,盡量是staticpublic static void doSomething() {System.out.println("doSomething");}
}

Master-Worker模式

一種歸并類型的模式。
任務的調度和執行分離,調度角色為Master,執行任務的角色為Worker,Master負責接收、分配任務和合并(Merge)結果,Woker執行任務。
Master-Worker 這種模式適合小規模任務分發。
大規模調度需另外設計如:事件驅動+MapReduce,去中心化、實時性、規模化處理更接近現代分布式架構。其設計目標是高效處理海量并發請求,保證準確性和一致性,而非簡單依賴單一Master協調。

工作竊取算法

工作竊取算法的核心思想是:工作線程自己的活干完了之后,會去看看別人有沒有沒干完的活,如果有就拿過來幫忙干。工作竊取算法的主要邏輯:每個線程擁有一個雙端隊列(本地隊列),用于存放需要執行的任務,當自己的隊列沒有任務時,可以從其他線程的任務隊列中獲得一個任務繼續執行。

并發總結

對于并發、分布式來說,線程\節點之間的同步是有明顯開銷的,應該用盡可能少的同步做到相同的效果。
原則:
  • 無鎖優先:用CAS(如AtomicInteger)或無共享數據替代鎖。
  • 局部化:線程/節點盡量獨立計算,減少交互。
  • 異步化:用事件驅動或消息隊列(如Kafka)解耦同步依賴。
  • 最終一致性:分布式場景下,犧牲強一致性換取性能(如BASE模型)。

線程篇歸納

Thread

Java從線程的設計開始,除了設計有線程通用結構——線程ID、名稱、狀態、優先級,也為線程安全與線程狀態流轉做了設計。
且使用數字+枚舉類轉換的方式,減少了線程實例對象本身的運行開銷。
對于線程狀態的操縱,提供了不同的方法進行,對于阻塞狀態,加重入鎖。
對于線城池,Java將工作線程封裝成Worker對象,并使用HashSet來存儲工作線程,BlockingQueue來作為工作任務隊列,且很好地使用了隊列的阻塞方法來實現核心線程的不被清除。

JUC

JUC為了保證線程的原子性、可見性、有序性,大量使用CAS操作與volatile關鍵字。
能使用CAS的場景都使用了CAS,無鎖優先,又針對CAS的問題,先后迭代有“熱點分離”、“隊列削峰”的設計來減少CAS自旋帶來的性能損失。
對于CAS+volatile+版本號保證原子性、可見性、解決ABA問題,Java也設計有對應原子類如AtomicStampedReference等,使用的版本號為別的int類型與boolean類型。

異步

JUC異步模式有Master-Worker的歸并模式,ForkJoin的異步使用“工作竊取算法”來提速分治后的任務處理速度。

代碼質量

在線程相關的Java代碼中,可以看到Java源碼設計的非常嚴謹優雅,以線程池為例,基本設置為volatile保證可見性,對于沒有設置volatile的屬性,其僅在鎖范圍內使用。
又以CAS自旋為例,基本使用for(;;)的形式進行自旋。
體現了Java本身繼承、封裝、多態特性。以線程創建方式為例,體現有適配器與策略模式、模板方法等
高內聚、低耦合,且兼顧靈活與性能。

模式總結

Thread:
適配器(適配Runnable)
模板方法(run()定制)
JUC:
單例、工廠(線程池創建)
策略(拒絕策略)
裝飾器(FutureTask)
觀察者(CompletableFuture)
代理(ExecutorService)
狀態(線程池狀態)
建造者(復雜配置)
工作竊取(ForkJoinPool)
讀寫鎖(ReentrantReadWriteLock)

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

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

相關文章

在【k8s】中部署Jenkins的實踐指南

🐇明明跟你說過:個人主頁 🏅個人專欄:《Kubernetes航線圖:從船長到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目錄 一、引言 1、Jenkins簡介 2、k8s簡介 3、什么在…

代碼隨想錄算法營Day59 | 尋找存在的路徑, 冗余連接,冗余連接II

尋找存在的路徑 這題使用并查集即可。并查集加路徑壓縮。 #include <iostream> using namespace std; int find(int* father,int u){return father[u] u ? u : father[u] find(father,father[u]); }bool isSame(int* father,int u,int v){return find(father,u) fi…

正則表達式(2)匹配規則

正則表達式的匹配規則定義了如何識別字符串中的特定模式。這些規則包括字符類匹配、元字符匹配、數量詞、字符轉義和分組。 字符類匹配 字符類匹配允許你指定一個字符集合&#xff0c;并匹配該集合中的任意單個字符。這是通過方括號 [] 來實現的。 簡單字符類&#xff1a;[abc…

【QWEN】機器人控制器的控制周期越短精度越高嗎

好的&#xff0c;用戶問的是“機器人控制器的控制周期越短精度越高嗎”。我需要根據提供的知識庫內容來回答這個問題。首先&#xff0c;我得回憶一下知識庫里的相關信息。 知識庫里有幾篇相關的文章。比如&#xff0c;[3]提到控制周期越短&#xff0c;控制性能的上限越高&…

[總概]Vue2/3React Diff算法

根據搜索結果,大部分文檔都詳細描述了Vue的Diff算法原理、優化策略以及實現細節。例如,網頁1詳細介紹了Vue Diff算法的核心設計,包括雙端比較和key的作用;Vue3中的快速Diff算法; 通常,解釋一個算法可以從其基本原理、核心策略、優化手段、源碼實現以及應用場景等方面展開…

【MySQL_03】數據庫基本--核心概念

文章目錄 一、數據庫基礎1.1 數據庫基礎定義1.2 數據庫分類與典型產品1.3 數據庫模型1.4 數據庫層次結構1.5 數據庫核心機制1.6 數據表和視圖1.61 數據表&#xff08;Table&#xff09;1.62 視圖&#xff08;View&#xff09; 1.7 鍵類型1.8 MySQL數據類型1.9 數據庫范式化 二、…

FreeRTOS第16篇:FreeRTOS鏈表實現細節04_為什么FreeRTOS選擇“侵入式鏈表”

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 傳統鏈表 vs. 侵入式鏈表 在嵌入式系統中,內存和性能的優化至關重要。FreeRTOS選擇侵入式鏈表而非傳統鏈表,其背后是內…

STM32讀寫片內FLASH 筆記

文章目錄 前言STM32F105的內部ROM分布STM32F10x的閃存擦寫解鎖FPECMain FLASH 的編寫 main Flash的擦除注意點 前言 在通過OTA的方式對設備進行升級&#xff0c;若在使用內部FLASH裝載固件程序的方式下&#xff0c;需要擦寫 內部FLASH 從而實現把新的固件程序寫入到 內部FLASH…

Python爬蟲實戰:爬取財金網實時財經信息

注意:以下內容僅供技術研究,請遵守目標網站的robots.txt規定,控制請求頻率避免對目標服務器造成過大壓力! 一、引言 在當今數字化時代,互聯網數據呈爆炸式增長,其中蘊含著巨大的商業價值、研究價值和社會價值。從金融市場動態分析到行業趨勢研究,從輿情監測到學術信息收…

3.3.2 用仿真圖實現點燈效果

文章目錄 文章介紹Keil生成.hex代碼Proteus仿真圖中導入.hex代碼文件開始仿真 文章介紹 點燈之前需要準備好仿真圖keil代碼 仿真圖參考前文&#xff1a;3.3.2 Proteus第一個仿真圖 keil安裝參考前文&#xff1a;3.1.2 Keil4安裝教程 keil新建第一個項目參考前文&#xff1a;3.1…

996引擎-問題處理:實現自定義道具變身卡

996引擎-問題處理:實現自定義道具變身卡 方案一、修改角色外觀(武器、衣服、特效) 實現變身先看效果創建個NPC測試效果方案二、利用 Buff 實現變身創建:變身Buff配buff表,實現人物變形測試NPC創建道具:變身卡配item表,添加道具:變身卡觸發函數參考資料方案一、修改角色外…

AI視頻領域的DeepSeek—阿里萬相2.1圖生視頻

讓我們一同深入探索萬相 2.1 &#xff0c;本文不僅介紹其文生圖和文生視頻的使用秘籍&#xff0c;還將手把手教你如何利用它實現圖生視頻。 如下為生成的視頻效果&#xff08;我錄制的GIF動圖&#xff09; 如下為輸入的圖片 目錄 1.阿里巴巴全面開源旗下視頻生成模型萬相2.1模…

驅動 AI 邊緣計算新時代!高性能 i.MX 95 應用平臺引領未來

智慧浪潮崛起&#xff1a;AI與邊緣計算的時代 正悄然深植于我們的日常生活之中&#xff0c;無論是火熱的 ChatGPT 與 DeepSeek 語言模型&#xff0c;亦或是 Meta 智能眼鏡&#xff0c;AI 技術已經無形地影響著我們的生活。這股變革浪潮并未停歇&#xff0c;而是進一步催生了更高…

如何快速判斷IP是否為代理

1.探究IP地址的地理分布 代理IP的所在位置&#xff0c;往往與用戶實際所在地不吻合。可以通過運用WHOIS查詢工具或在線IP地址定位服務&#xff0c;輸入所需查詢的IP&#xff0c;即可獲得其地理位置信息。 若該信息顯示的位置并非用戶所在城市或顯示為知名代理服務器節點&…

從CL1看生物計算機的創新突破與發展前景:技術、應用與挑戰的多維度剖析

一、引言 1.1 研究背景與意義 隨著科技的飛速發展&#xff0c;計算機技術已經成為推動現代社會進步的核心力量之一。從最初的電子管計算機到如今的大規模集成電路計算機&#xff0c;計算機的性能得到了極大的提升&#xff0c;應用領域也不斷拓展。然而&#xff0c;傳統計算機…

AI革命先鋒:DeepSeek與藍耘通義萬相2.1的無縫融合引領行業智能化變革

云邊有個稻草人-CSDN博客 目錄 引言 一、什么是DeepSeek&#xff1f; 1.1 DeepSeek平臺概述 1.2 DeepSeek的核心功能與技術 二、藍耘通義萬相2.1概述 2.1 藍耘科技簡介 2.2 藍耘通義萬相2.1的功能與優勢 1. 全鏈條智能化解決方案 2. 強大的數據處理能力 3. 高效的模型…

zabbix圖表中文顯示方框

問題&#xff1a; zabbix安裝完成后&#xff0c;查看圖形&#xff0c;下方中文顯示為方框 思路&#xff1a; 替換字體文件&#xff0c;或者修改配置文件指向中文可以正常顯示的字體文件 方案&#xff1a; 查找資料確認影響因素 通過資料查詢得知&#xff0c;使用的字體文…

【Linux-網絡】HTTP的清風與HTTPS的密語

&#x1f3ac; 個人主頁&#xff1a;誰在夜里看海. &#x1f4d6; 個人專欄&#xff1a;《C系列》《Linux系列》《算法系列》 ?? 道阻且長&#xff0c;行則將至 目錄 &#x1f4da; 引言 &#x1f4da; 一、HTTP &#x1f4d6; 1.概述 &#x1f4d6; 2.URL &#x1f5…

通過數據庫網格架構構建現代分布式數據系統

在當今微服務驅動的世界中&#xff0c;企業在跨分布式系統管理數據方面面臨著越來越多的挑戰。數據庫網格架構已成為應對這些挑戰的強大解決方案&#xff0c;它提供了一種與現代應用架構相匹配的分散式數據管理方法。本文將探討數據庫網格架構的工作原理&#xff0c;以及如何使…

RangeError: Radix must be an integer between 2 and 36

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…