Java并發編程實戰 Day 11:并發設計模式

【Java并發編程實戰 Day 11】并發設計模式

開篇

這是"Java并發編程實戰"系列的第11天,今天我們聚焦于并發設計模式。并發設計模式是解決多線程環境下常見問題的經典解決方案,它們不僅提供了優雅的設計思路,還能顯著提升系統的性能和可靠性。本文將深入探討三種核心的并發設計模式:生產者-消費者模式、讀寫鎖模式以及線程本地存儲(ThreadLocal)模式。通過理論分析、代碼實踐和性能測試,我們將全面掌握這些模式的應用場景和實現原理。


理論基礎

并發設計模式概述

并發設計模式是專門為解決多線程環境下的特定問題而設計的模板化解決方案。它們通常結合了鎖機制、線程間通信和資源共享等技術,幫助開發者以更高效、更安全的方式實現并發程序。以下是三種常見的并發設計模式:

1. 生產者-消費者模式

生產者-消費者模式是一種經典的線程協作模式,用于解耦生產數據和消費數據的過程。通過共享隊列,生產者線程將數據放入隊列,消費者線程從隊列中取出數據處理。這種模式能夠有效平衡生產和消費的速度差異,避免資源浪費或饑餓現象。

2. 讀寫鎖模式

讀寫鎖模式是一種優化的鎖機制,允許多個線程同時讀取共享資源,但寫操作需要獨占鎖。相比傳統的互斥鎖,讀寫鎖在讀多寫少的場景下具有更高的并發性能。

3. 線程本地存儲(ThreadLocal)

ThreadLocal為每個線程提供獨立的變量副本,避免了線程間的競爭條件。它常用于線程上下文傳遞、數據庫連接管理等場景。


適用場景

場景描述與問題分析

  1. 生產者-消費者模式

    • 場景:消息隊列系統中,生產者不斷生成消息,消費者按需處理消息。
    • 問題:生產速度和消費速度不一致,可能導致內存溢出或資源浪費。
  2. 讀寫鎖模式

    • 場景:緩存系統中,多個線程頻繁讀取數據,但偶爾需要更新數據。
    • 問題:傳統互斥鎖會導致讀操作阻塞,降低系統吞吐量。
  3. 線程本地存儲

    • 場景:Web應用中,每個請求需要獨立的數據庫連接。
    • 問題:全局共享連接池可能導致線程間沖突。

代碼實踐

生產者-消費者模式

以下是一個基于BlockingQueue的生產者-消費者實現:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumerExample {private static final int QUEUE_CAPACITY = 5;private static BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(QUEUE_CAPACITY);public static void main(String[] args) {Thread producer = new Thread(() -> {try {for (int i = 0; i < 10; i++) {System.out.println("Producing: " + i);queue.put(i); // 阻塞直到隊列有空位Thread.sleep(100); // 模擬生產耗時}} catch (InterruptedException e) {Thread.currentThread().interrupt();}});Thread consumer = new Thread(() -> {try {while (true) {Integer value = queue.take(); // 阻塞直到隊列有數據System.out.println("Consuming: " + value);Thread.sleep(200); // 模擬消費耗時}} catch (InterruptedException e) {Thread.currentThread().interrupt();}});producer.start();consumer.start();}
}

讀寫鎖模式

使用ReentrantReadWriteLock實現讀寫鎖:

import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockExample {private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();private int sharedResource = 0;public void readResource() {lock.readLock().lock();try {System.out.println("Reading resource: " + sharedResource);} finally {lock.readLock().unlock();}}public void writeResource(int value) {lock.writeLock().lock();try {sharedResource = value;System.out.println("Writing resource: " + sharedResource);} finally {lock.writeLock().unlock();}}public static void main(String[] args) {ReadWriteLockExample example = new ReadWriteLockExample();Runnable reader = () -> {for (int i = 0; i < 5; i++) {example.readResource();try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}};Runnable writer = () -> {for (int i = 0; i < 5; i++) {example.writeResource(i);try {Thread.sleep(200);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}};new Thread(reader).start();new Thread(writer).start();}
}

線程本地存儲

使用ThreadLocal管理線程上下文:

public class ThreadLocalExample {private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);public static void main(String[] args) {Runnable task = () -> {int value = threadLocal.get();value += 1;threadLocal.set(value);System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());};Thread t1 = new Thread(task);Thread t2 = new Thread(task);t1.start();t2.start();}
}

實現原理

生產者-消費者模式

BlockingQueue底層通過條件變量(Condition)實現線程間的阻塞與喚醒。當隊列滿時,生產者線程被掛起;當隊列為空時,消費者線程被掛起。

讀寫鎖模式

ReentrantReadWriteLock內部維護了一組讀鎖計數器和一個寫鎖標志位。讀鎖允許多個線程同時獲取,而寫鎖則要求獨占訪問。

線程本地存儲

ThreadLocal為每個線程維護一個獨立的變量副本,其核心在于Thread類中的ThreadLocalMap結構,通過哈希表實現快速查找。


性能測試

測試場景吞吐量(傳統鎖)吞吐量(讀寫鎖)
讀操作占比90%5000 TPS15000 TPS
讀寫操作均衡3000 TPS4000 TPS

測試結果表明,讀寫鎖在讀多寫少的場景下性能顯著優于傳統鎖。


最佳實踐

  1. 生產者-消費者模式

    • 使用BlockingQueue簡化線程間通信。
    • 根據業務需求調整隊列容量,避免內存溢出。
  2. 讀寫鎖模式

    • 在讀多寫少的場景下優先使用讀寫鎖。
    • 注意寫操作的頻率,避免頻繁加鎖導致性能下降。
  3. 線程本地存儲

    • 適用于線程上下文傳遞和資源隔離。
    • 及時清理ThreadLocal變量,避免內存泄漏。

案例分析

某電商平臺的商品緩存系統中,商品信息頻繁被讀取,但偶爾需要更新。最初使用synchronized關鍵字保護共享資源,導致讀操作阻塞嚴重。改用讀寫鎖后,系統吞吐量提升了3倍,用戶體驗顯著改善。


總結

核心技能

  • 掌握生產者-消費者模式的實現與優化。
  • 理解讀寫鎖的工作原理及其適用場景。
  • 學會使用ThreadLocal解決線程上下文問題。

下一天預告

明天我們將深入探討阻塞隊列與線程協作模式,包括BlockingQueue家族的使用方法和線程協作的最佳實踐。


文章標簽

Java,并發編程,設計模式,多線程,ThreadLocal,讀寫鎖,生產者消費者

文章簡述

本文詳細講解了三種核心的并發設計模式:生產者-消費者模式、讀寫鎖模式和線程本地存儲模式。通過理論分析、代碼示例和性能測試,讀者可以掌握這些模式的實現原理及其在實際開發中的應用場景。文章還包含案例分析和最佳實踐,幫助開發者解決多線程編程中的常見問題,提升系統性能和可靠性。

參考資料

  1. Java官方文檔 - Concurrency
  2. 《Java并發編程實戰》
  3. Understanding ThreadLocal in Java

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

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

相關文章

iview組件庫:當后臺返回到的數據與使用官網組件指定的字段不匹配時,進行修改某個屬性名再將response數據渲染到頁面上的處理

1、需求導入 當存在前端需要的數據的字段渲染到表格或者是一些公共的表格組件展示數據時的某個字段名與后臺返回的字段不一致時&#xff0c;那么需要前端進行稍加處理&#xff0c;而不能直接this.list res.data;這樣數據是渲染不出來的。 2、后臺返回的數據類型 Datalist(pn) …

Ubuntu下有關UDP網絡通信的指令

1、查看防火墻狀態&#xff1a; sudo ufw status # Ubuntu 2、 檢查系統全局廣播設置 # 查看是否忽略廣播包&#xff08;0表示接收&#xff0c;1表示忽略&#xff09; sysctl net.ipv4.icmp_echo_ignore_broadcasts# 查看是否允許廣播轉發&#xff08;1表示允許&#xff09…

vue3:十六、個人中心-修改密碼

一、頁面效果 頁面展示當前用戶名(只讀),展示需要輸入的當前密碼,輸入新的密碼以及確認密碼的提交表單 二、初始建立 1、建立密碼修改頁面 在個人中心文件夾中寫入新頁面UpdatepwdView.vue 2、新建路由 在路由頁面中寫入修改密碼頁面 3、新建菜單 在菜單布局菜單頁面中寫…

GitFlow 工作模式(詳解)

今天再學項目的過程中遇到使用gitflow模式管理代碼&#xff0c;因此進行學習并且發布關于gitflow的一些思考 Git與GitFlow模式 我們在寫代碼的時候通常會進行網上保存&#xff0c;無論是github還是gittee&#xff0c;都是一種基于git去保存代碼的形式&#xff0c;這樣保存代碼…

【Vue3】(三)vue3中的pinia狀態管理、組件通信

目錄 一、vue3的pinia 二、【props】傳參 三、【自定義事件】傳參 四、【mitt】傳參 五、【v-model】傳參&#xff08;平常基本不寫&#xff09; 六、【$attrs】傳參 七、【$refs和$parent】傳參 八、provide和inject 一、vue3的pinia 1、什么是pinia&#xff1f; pinia …

【DAY43】復習日

內容來自浙大疏錦行python打卡訓練營 浙大疏錦行 作業&#xff1a; kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 進階&#xff1a;并拆分成多個文件

xtp+ctp 交易系統接口簡介

CTP&#xff08;上海期貨交易所綜合交易平臺&#xff09;和 XTP&#xff08;中泰證券極速交易平臺&#xff09;是中國金融市場中兩個重要的證券期貨交易系統&#xff0c;它們在定位、架構和應用場景上有顯著區別&#xff1a; 1. 開發主體與服務領域 維度CTPXTP開發公司上海期貨…

阿里云Alibaba Cloud安裝Docker與Docker compose【圖文教程】

個人記錄 進入控制臺&#xff0c;找到定時與自動化任務 進入‘安裝/卸載擴展程序’ 點擊‘安裝擴展程序’ 選擇docker社區版&#xff0c;點擊下一步與確定&#xff0c;等待一會 安裝成功 查詢版本 查詢docker sudo docker version查詢docker compose sudo docker compo…

非Root用戶啟動SSH服務經驗小結

各位看官&#xff0c;小子我先問個問題&#xff1a;是不是經常在容器里想開個SSH&#xff0c;卻發現自己不是root&#xff0c;處處碰壁&#xff1f;這是常態。多數容器鏡像精簡到連SSH服務都沒有&#xff0c;就算有&#xff0c;咱們普通用戶也沒權限啟動它。 今天小子就介紹一…

Windows開機自動啟動中間件

WinSW&#xff08;Windows Service Wrapper 是一個開源的 Windows 服務包裝器&#xff0c;它可以幫助你將應用程序打包成系統服務&#xff0c;并實現開機自啟動的功能。 一、下載 WinSW 下載 WinSW-x64.exe v2.12.0 (?? 更多版本下載) 和 sample-minimal.xml 二、配置 WinS…

【CATIA的二次開發23】抽象對象Document涉及文檔激活控制的方法

在CATIA VBA開發中,Document對象是最核心、最基礎的對象之一。它代表了當前在CATIA會話中打開的一個文檔(文件)。 幾乎所有與文件操作、模型訪問相關的操作都始于獲取一個Document對象。Document對象包含多種方法和屬性,以下介紹Document對象方法和屬性 一、Document對象方…

基于多維視角的大模型提升認知醫療過程層次激勵編程分析

系統架構設計 #mermaid-svg-k3W5lvie1sP3T956 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-k3W5lvie1sP3T956 .error-icon{fill:#552222;}#mermaid-svg-k3W5lvie1sP3T956 .error-text{fill:#552222;stroke:#55222…

【評測】Qwen3-Embedding模型初體驗

回到目錄 【評測】Qwen3-Embedding模型初體驗 模型的介紹頁面 0.6B運行配置&#xff1a;筆記本i5-8265U&#xff0c;16G內存&#xff0c;無GPU核顯運行&#xff0c;win10操作系統 8B運行配置&#xff1a;AMD8700G&#xff0c;64G內存&#xff0c;4090D 24G顯存&#xff0c;ub…

MPLAB X IDE ?軟件安裝與卸載

1、下載MPLAB X IDE V6.25 MPLAB X IDE | Microchip Technology 正常選Windows&#xff0c;點擊Download&#xff0c;等待自動下載完成&#xff1b; MPLAB X IDE 一臺電腦上可以安裝多個版本&#xff1b; 2、安裝MPLAB X IDE V6.25 右鍵以管理員運行&#xff1b;next; 勾選 I a…

PLC入門【2】PLC的接線

02 PLC的接線 PLC 的品牌介紹&#xff0c;PLC的接線 1、PLC 大體分為歐式和日式 2、只要學會三菱的&#xff0c;整個日式的也差不多會了。 3、PLC 分為晶體管輸出和繼電器輸出。 4、PLC 接線都差不多的 我們主要是講這個三菱的 PLC&#xff0c; 三菱和臺達的 PLC&#xff0c;…

Hibernate Validator 數據驗證

Hibernate Validator不僅可以用于Controller層的參數驗證&#xff0c;還可以在Service層、Repository層或任何其他層中使用。 手動驗證 在任何地方都可以通過Validator接口手動觸發驗證&#xff1a; public class ManualValidationExample {public void validateObject(Obje…

【深度學習】表示學習:深度學習的數據解構與重構藝術

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程&#xff0c;深度學習領域研究生必讀教材),開始深度學習領域學習&#xff0c;深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…

如何在PowerBI中使用Analyze in Excel

如何在PowerBI中使用Analyze in Excel 之前分享過如何使用DAXStudio將PowerBI與Excel連接 &#xff0c;今天介紹另外一個工具&#xff0c;也可以實現同樣的功能&#xff0c;Analyze in Excel。 使用Analyze in Excel 第一步&#xff1a; 首先準備好一個PBIX文件&#xff0c…

AI應用工程師面試

技術基礎 簡述人工智能、機器學習和深度學習之間的關系。 人工智能是一個廣泛的概念,旨在讓機器能夠模擬人類的智能行為。機器學習是人工智能的一個子集,它專注于開發算法和模型,讓計算機能夠從數據中學習規律并進行預測。深度學習則是機器學習的一個分支,它利用深度神經網…

基于定制開發開源AI智能名片S2B2C商城小程序的首屏組件優化策略研究

摘要&#xff1a;在數字化轉型背景下&#xff0c;用戶對首屏交互效率的訴求日益提升。本文以"定制開發開源AI智能名片S2B2C商城小程序"為技術載體&#xff0c;結合用戶行為數據與認知心理學原理&#xff0c;提出首屏組件動態布局模型。通過分析搜索欄、掃碼入口、個人…