多線程訪問Servlet如何謹慎處理共享資源

1.?避免共享狀態(最佳實踐)

  • 核心思想:Servlet 本身應設計為無狀態(Stateless),不依賴實例變量存儲請求相關數據。

  • 實現方式

    • 將變量聲明在方法內部(局部變量),每個線程獨享棧內存。

    • 若需跨請求傳遞數據,使用請求作用域(HttpServletRequest)或會話作用域(HttpSession)。

  • 示例

    public class SafeServlet extends HttpServlet {// ? 危險:實例變量被所有線程共享// private int counter;protected void doGet(HttpServletRequest req, HttpServletResponse resp) {// ? 安全:局部變量,線程獨享int localCounter = 0;localCounter++;resp.getWriter().write("Count: " + localCounter);}
    }

2.?使用線程安全的數據結構

  • 適用場景:必須共享資源時(如全局計數器、緩存)。

  • 實現方式

    • 使用?java.util.concurrent?包中的線程安全類:
      ConcurrentHashMap,?AtomicInteger,?CopyOnWriteArrayList?等。

    • 避免直接使用非線程安全的類(如?HashMapArrayList)。

  • 示例

    public class CounterServlet extends HttpServlet {// ? 線程安全計數器private AtomicInteger atomicCounter = new AtomicInteger(0);protected void doGet(HttpServletRequest req, HttpServletResponse resp) {int count = atomicCounter.incrementAndGet();resp.getWriter().write("Atomic Count: " + count);}
    }

3.?同步(Synchronization)

  • 適用場景:需保護臨界區(Critical Section)代碼時。

  • 實現方式

    • 使用?synchronized?關鍵字修飾方法或代碼塊。

    • 注意鎖的粒度:盡量縮小同步范圍以提高性能。

  • 示例

    public class SyncServlet extends HttpServlet {private int counter = 0;private final Object lock = new Object(); // 專用鎖對象protected void doGet(HttpServletRequest req, HttpServletResponse resp) {synchronized (lock) { // ? 同步代碼塊counter++;resp.getWriter().write("Sync Count: " + counter);}}
    }

4.?使用 ThreadLocal

  • 適用場景:需要為每個線程維護獨立副本的資源(如數據庫連接、SimpleDateFormat)。

  • 原理:通過?ThreadLocal?為每個線程創建資源副本,避免競爭。

  • 示例

    public class DateFormatServlet extends HttpServlet {// ? 每個線程獨立持有 SimpleDateFormatprivate static final ThreadLocal<SimpleDateFormat> dateFormat =ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));protected void doGet(HttpServletRequest req, HttpServletResponse resp) {SimpleDateFormat sdf = dateFormat.get(); // 獲取當前線程的副本String date = sdf.format(new Date());resp.getWriter().write(date);}@Overridepublic void destroy() {dateFormat.remove(); // 清理線程副本}
    }

5.?外部化資源管理

  • 適用場景:數據庫連接池、緩存等需線程安全的外部資源。

  • 實現方式

    • 使用成熟的線程安全中間件(如 Redis、數據庫連接池 HikariCP)。

    • 確保資源本身是線程安全的(如 JDBC 的?DataSource)。


6.?Servlet 作用域控制(謹慎使用)

  • 通過配置使 Servlet 非單例(僅特定容器支持,如通過?@WebServlet(urlPatterns="...", loadOnStartup=1, asyncSupported=true)?配置異步模式)。

  • 替代方案:使用框架(如 Spring MVC 的?@Scope("prototype")),但需權衡性能。


關鍵原則總結

策略適用場景優點缺點
無狀態設計絕大多數情況簡單高效,無需同步不適合必須共享資源的場景
線程安全類共享計數器、緩存等性能高,無需手動同步功能受限
同步(synchronized)臨界區操作(如文件寫入)靈活,可控粒度性能下降,可能死鎖
ThreadLocal線程綁定資源(如數據庫連接)避免競爭,資源隔離內存泄漏風險

常見陷阱與解決方案

  1. SimpleDateFormat 非線程安全

    • ? 錯誤做法:private SimpleDateFormat sdf = new SimpleDateFormat(...);

    • ? 正確做法:使用?ThreadLocal?或替換為?DateTimeFormatter(Java 8+ 線程安全)。

  2. Servlet 中存儲用戶狀態

    • ? 錯誤做法:在 Servlet 實例變量中保存用戶數據。

    • ? 正確做法:使用?HttpSession?或請求參數。

  3. 過度同步導致性能瓶頸

    • ? 錯誤做法:synchronized?修飾整個?service()?方法。

    • ? 正確做法:縮小同步范圍至必要代碼塊。


通過合理選擇上述策略,可以在保證線程安全的前提下,最大限度提升 Servlet 的并發性能

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

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

相關文章

從Windows到Mac的過渡:學習筆記與心得

作為一名長期使用Windows操作系統的用戶&#xff0c;當我決定轉換到Mac時&#xff0c;心中充滿了期待與好奇。Mac以其獨特的操作系統和設計風格著稱&#xff0c;雖然有許多相似之處&#xff0c;但仍有不少差異需要適應。為了幫助其他有類似轉換需求的朋友&#xff0c;我總結了一…

TestNG接口自動化

第一章、 Rest assured接口測試框架 一、概述 接口自動化的框架&#xff0c;主要是用來做接口自動化測試&#xff0c;返回的報文都是JSON 語法比較簡單&#xff0c;只需要掌握常用的方法 用例運行的速度非常快 斷言的機制 Json 封裝相關方法&#xff0c;jsonpath&#xff0c;x…

【速寫】KV-cache與解碼的再探討(以束搜索實現為例)

文章目錄 1 Beam Search 解碼算法實現2 實現帶KV Cache的Beam Search解碼3 關于在帶kv-cache的情況下的use_cache參數 1 Beam Search 解碼算法實現 下面是一個使用PyTorch實現的beam search解碼算法&#xff1a; 幾個小細節&#xff1a; 束搜索可以加入length_penalty&#…

ABP-Book Store Application中文講解 - 前期準備 - Part 3:Acme.BookStore項目模塊詳解之二

1. 匯總 ABP-Book Store Application中文講解-匯總-CSDN博客 2. 前一章 ABP-Book Store Application中文講解 - 前期準備 - Part 3:Acme.BookStore項目模塊詳解 項目之間的引用關系。 目錄 1. .Domain.Shared 2. .Domain 3. .Application.Contracts 4. .Application 5…

【Leetcode刷題隨筆】349. 兩個數組的交集

1. 題目描述 給定兩個數組nums1和nums2&#xff0c;返回它們的交集。輸出結果中的每個元素一定是唯一的。我們可以不考慮輸出結果的順序。 示例1: 輸入:nums1 [1,2,2,1], nums2 [2,2] 輸出&#xff1a;[2] 題目條件&#xff1a; 1 < nums1.length, nums2.length < 10…

Unity打包安卓失敗 Build failure 解決方法

【Unity】打包安卓失敗 Build failure 的解決方法_com.android.build.gradle.internal.res.linkapplicat-CSDN博客 unity在打包時設置手機屏幕橫屏豎屏的方法_unity打包默認橫屏-CSDN博客

Window、CentOs、Ubuntu 安裝 docker

Window 版本 網址&#xff1a;https://www.docker.com/ 下載 下載完成后&#xff0c;雙擊安裝就可以了 Centos 版本 卸載 Docker &#xff08;可選&#xff09; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-log…

Matlab自學筆記五十四:符號數學工具箱和符號運算、符號求解、繪圖

1.什么是符號數學工具箱&#xff1f; 符號數學工具箱是Matlab針對符號對象的運算功能&#xff0c;它引入了一種特殊的數據類型 - 符號對象&#xff1b; 該數據類型包括符號數字&#xff0c;符號變量&#xff0c;符號表達式和符號函數&#xff0c;還包含符號矩陣&#xff0c;以…

OpenCV進階操作:圖像的透視變換

文章目錄 前言一、什么是透視變換&#xff1f;二、透視變換的過程三、OpenCV透視變換核心函數四、文檔掃描校正&#xff08;代碼&#xff09;1、預處理2、定義輪廓點的排序函數3、定義透視變換函數4、讀取原圖并縮放5、輪廓檢測6、繪制最大輪廓7、對最大輪廓進行透視變換8、旋轉…

【python】基礎知識點100問

以下是Python基礎語法知識的30條要點整理,涵蓋數據類型、函數、控制結構等核心內容,結合最新資料歸納總結: 基礎30問 一、函數特性 函數多返回值 支持用逗號分隔返回多個值,自動打包為元組,接收時可解包到多個變量 def func(): return 1, "a" x, y = func()匿…

采用AI神經網絡降噪算法的通信語音降噪(ENC)模組性能測試和應用

采用AI降噪的語言通話環境抑制模組性能效果測試 隨著AI時代來臨.通話設備的環境噪音抑制也進入AI降噪算法時代. AI神經網絡降噪技術是一款革命性的語音處理技術&#xff0c;他突破了傳統單麥克風和雙麥克風降噪的局限性,利用采集的各種日常環境中的噪音樣本進行訓練學習.讓降噪…

openwrt目錄結構(部分)

1&#xff0c;openwrt 原始目錄需要注意的目錄 tools: 該目錄下存放著一些&#xff0c;編譯工程的自動化工具包和一些在編譯過程用到的命令包&#xff0c; 查看目錄下的Makefile&#xff0c;知道其會在編譯過程中將依賴包下載 例如&#xff1a; autoconf / lzma / mkimage/ …

RDB和AOF的區別

Redis提供兩種主要的持久化機制&#xff1a;RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09;&#xff0c;它們在數據持久化方式、性能影響及恢復策略上各有特點。以下是兩者的對比分析及使用建議&#xff1a; RDB&#xff08;快照持久…

基于大模型的甲狀腺結節診療全流程預測與方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 1.3 國內外研究現狀 二、大模型預測原理與方法 2.1 相關大模型概述 2.2 數據收集與預處理 2.3 模型訓練與驗證 三、術前預測與評估 3.1 結節性質預測 3.1.1 良惡性判斷 3.1.2 與傳統診斷方法對比 3.2 手術風險預測…

逆向破解:x64dbg

文章目錄 一、CPU窗口1、反匯編窗口2、寄存器窗口3、棧地址窗口4、十六進制數據窗口5、堆棧參數解析窗口 二、常用快捷鍵三、字符串檢索功能四、調試功能1、上一步 一、CPU窗口 1、反匯編窗口 2、寄存器窗口 寄存器窗口用于顯示和解釋當前線程環境下CPU寄存器的各種狀態值和內…

免布線視頻樁如何重塑停車管理模式

傳統停車管理常因布線復雜、維護成本高而難以推廣&#xff0c;而“免布線視頻樁”通過無線設計、低功耗與高精度檢測&#xff0c;為城市停車提供高效解決方案。作為智慧城市建設的創新工具&#xff0c;免布線視頻樁以即裝即用、長效續航等特性&#xff0c;正在重塑停車管理模式…

【CTFer成長之路】舉足輕重的信息搜集

舉足輕重的信息搜集 信息搜集 常見的搜集 題目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80啟動方式 docker-compose up -d 題目Flag n1book{info_…

springboot3+vue3融合項目實戰-大事件文章管理系統-更新用戶密碼

大致分為這三步 首先在usercontroller中增加updatePwd方法 PatchMapping ("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params){//1.校驗參數String oldPwd params.get("old_pwd");String newPwd params.get("n…

OpenCV進階操作:指紋驗證、識別

文章目錄 前言一、指紋驗證1、什么是指紋驗證2、流程步驟 二、使用步驟&#xff08;案例&#xff09;三、指紋識別&#xff08;案例&#xff09;1、這是我們要識別的指紋庫2、這是待識別的指紋圖3、代碼4、結果 總結 前言 指紋識別作為生物識別領域的核心技術之一&#xff0c;…

ECLIC中斷流程及實際應用 —— RISC-V中斷機制(二)

在長期的嵌入式開發實踐中&#xff0c;對中斷機制的理解始終停留在表面層次&#xff0c;特別當開發者長期局限于純軟件抽象層面時&#xff0c;對中斷機制的理解極易陷入"知其然而不知其所以然"的困境&#xff0c;這種認知的局限更為明顯&#xff1b;隨著工作需要不斷…