線程故事:Web應用程序中的ThreadLocal

本周,我花了一些合理的時間來消除Web應用程序中的所有ThreadLocal變量。 原因是他們造成了類加載器泄漏,我們不能再適當地取消部署我們的應用程序。 取消部署應用程序后,當GC根目錄繼續引用應用程序對象時,將發生類加載器泄漏。 如果取消部署后仍引用了應用程序對象,則無法對整個類加載器進行垃圾回收,因為考慮的對象引用了您的應用程序類文件,而應用程序類文件又引用了類加載器。 取消部署和重新部署幾次后,這將導致OutOfMemoryError

ThreadLocal是一種經典的候選人,可以輕松在Web應用程序中創建類加載器泄漏。 服務器正在管理池中的線程。 這些線程的壽命比您的Web應用程序更長。 實際上,直到底層JVM死亡,它們才完全消失。 現在,如果將ThreadLocal放入引用類的對象的池線程中,則必須*小心。 您需要確保使用ThreadLocal.remove()再次刪除此變量。 Web應用程序中的問題是:安全刪除ThreadLocal變量的正確位置在哪里? 此外,您可能不想每次同事決定將另一個ThreadLocal添加到托管線程時都修改該“刪除代碼”。

我們圍繞線程局部開發了一個包裝器類,該類將所有線程局部變量保留在一個單獨的ThreadLocal變量中。 這是代碼。

public class ThreadLocalUtil {private final static ThreadLocal<ThreadVariables> THREAD_VARIABLES = new ThreadLocal<ThreadVariables>() {/*** @see java.lang.ThreadLocal#initialValue()*/@Overrideprotected ThreadVariables initialValue() {return new ThreadVariables();}};public static Object getThreadVariable(String name) {return THREAD_VARIABLES.get().get(name);}public static Object getThreadVariable(String name, InitialValue initialValue) {Object o = THREAD_VARIABLES.get().get(name);if (o == null) { THREAD_VARIABLES.get().put(name, initialValue.create());return getThreadVariable(name);} else {return o;}}public static void setThreadVariable(String name, Object value) {THREAD_VARIABLES.get().put(name, value);}public static void destroy() {THREAD_VARIABLES.remove();}
}public class ThreadVariables extends HashMap<String, Object> { }public abstract class InitialValue {public abstract Object create();}

實用程序類的優點是無需開發人員就可以單獨管理線程局部變量的生命周期。 該類將所有線程局部變量放在一個變量映射中。 可以調用destroy()方法,在其中可以安全地刪除Web應用程序中的所有線程本機。 在我們的例子中,這就是ServletRequestListener -> requestDestroyed()方法。 您還需要將finally塊放置在其他位置。 典型的地方是HttpServletinit()doPost()doGet()方法附近。 完成請求或意外引發異常后,這可能會刪除池工作線程中的所有線程本地。 有時會發生服務器的main線程泄漏線程局部變量的情況。 如果是這種情況,則需要找到正確的位置來調用ThreadLocalUtil -> destroy()方法。 為此,要弄清楚主線程實際上在哪里創建線程變量。 您可以使用調試器來做到這一點。

許多人建議出于多種原因而在Web應用程序中省略ThreadLocal 。 在池化線程環境中刪除它們可能非常困難,以便您可以安全地取消部署應用程序。 ThreadLocal變量可能有用,但是在應用它們之前考慮其他技術是很公平的。 Web應用程序可以攜帶請求范圍參數的替代方法是HttpServletRequest 。 許多Web框架允許通用的請求參數訪問以及請求/會話屬性訪問,而無需與本地Servlet / Portlet API綁定。 同樣,許多框架支持請求使用依賴項注入將作用域Bean注入到對象樹中。 所有這些選項都滿足大多數要求,因此在使用ThreadLocal之前應考慮這些選項。

參考:線程故事: JCG合作伙伴 Niklas的Web應用程序中的ThreadLocal。


翻譯自: https://www.javacodegeeks.com/2012/05/threading-stories-threadlocal-in-web.html

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

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

相關文章

n-1位數

n-1位數 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;1描述已知w是一個大于10但不大于1000000的無符號整數&#xff0c;若w是n(n≥2)位的整數&#xff0c;則求出w的后n-1位的數。 輸入第一行為M&#xff0c;表示測試數據組數。接下來M行&…

Android之封裝好的異步網絡請求框架

1.簡介 Android中網絡請求一般使用Apache HTTP Client或者采用HttpURLConnection&#xff0c;但是直接使用這兩個類庫需要寫大量的代碼才能完成網絡post和get請求&#xff0c;而使用這個MyHttpUtils庫可以大大的簡化操作&#xff0c;它是基于HttpURLConnection&#xff0c;所有…

華潤置地php面試題_從一流到頂流|2020華潤置地與沈陽一起美好

如果用一句話來形容華潤置地進入沈陽13年的發展歷程&#xff0c;你認為是什么&#xff1f;“從優秀到卓越”。用2020年的語言你給我翻譯一下&#xff1f;“從一流到頂流”&#xff01;01/ 初識的美好猶記2007年1月&#xff0c;央企華潤置地首進沈陽&#xff0c;在大館原址呈現出…

金融工作用計算機嗎,為什么計算機專業的人想轉金融,而金融專業的想轉計算機?...

1首先兩個專業都很有前途。如果好好學IT&#xff0c;應該是走技術路線&#xff0c;30歲后逐漸開始搞些管理或者設計之類的。當然&#xff0c;繼續搞技術也沒問題。只是要不斷學習&#xff0c;因為發展很快&#xff0c;IT業自身不斷更新。很多人說IT枯燥&#xff0c;難學&#x…

Java GUI應用程序關閉陷阱

最近&#xff0c;我遇到了一個或兩個Java GUI應用程序在關閉時無法關閉的問題。 它們似乎是一個過程&#xff0c;消耗著計算機資源。 今天&#xff0c;我深入探究了問題的根源&#xff0c;這是一個我以前從未意識到的棘手問題&#xff0c;所以我想我會分享一下。 理論上&#x…

shell啟動程序腳本

#!/bin/bash#/usr/local/xxx/bin/xxxx.sh start#/usr/local/xxx/bin/startup.shfor i in find /server -name start.sh do fadirdirname $i //讀取父目錄 cd $fadir echo > nohup.out ./start.sh & sleep 2 echo "start succe…

Unity性能優化的N種武器

貼圖&#xff1a; l 控制貼圖大小&#xff0c;盡量不要超過 1024 x1024&#xff1b; l 盡量使用2的n次冪大小的貼圖&#xff0c;否則GfxDriver里會有2份貼圖&#xff1b; l 盡量使用壓縮格式減小貼圖大小&#xff1b; l 若干種貼圖合并技術&#xff1b; l 去除多余的alpha…

cmd控制屏幕光標_電腦控制手機?上班時間愉快盡情地玩手機吧!它值得您擁有!...

在現今時代&#xff0c;手機已成為人們必不可少的工具&#xff0c;有的時候甚至可以說手機比電腦方便好用多了&#xff0c;例如某些實用的APP軟件就只有手機端并沒有電腦端&#xff0c;想使用的話就得整天捧著手機盯著不放。但別忘記&#xff0c;我們大多數都是打工族&#xff…

xp系統設置鎖定計算機,系統鎖定時不關機的訣竅 給XP系統關閉計算機再加一把鎖...

很多用戶抱怨在使用電腦的過程中&#xff0c;總是經常會被瑣碎的事情打斷&#xff0c;有時候難免暫時離開電腦&#xff0c;處于便利和資料安全&#xff0c;我們往往會按下“WindowsL”來鎖定計算機。這樣&#xff0c;操作方便同時又能阻止他人亂動我們的計算機。但是如果遇到好…

ACM題目————中位數

題目描述 長為L的升序序列S&#xff0c;S[L / 2]為其中位數。 給出兩個等長升序序列S1和S2&#xff0c;求兩序列合并并排序后的中位數。 輸入 多組數據&#xff0c;每組第一行為n&#xff0c;表示兩個等長升序序列的長度。 接下來n行為升序序列S1的元素&#xff0c;再接下來n行…

Regular Exprassion--正則表達式基礎

正則表達式&#xff1a; 強大靈活的文本處理工具 語法&#xff1a; 普通字符 轉義字符 \ , \t , \n , \\ 標準字符集合&#xff08;大寫代表相反的意思&#xff09; \d 任意一個數字 \w 任意一個字母、數字、下劃線 \s 空白符&#xff…

使用ReportNG更好看的TestNG HTML測試報告– Maven指南

當“擴展TestCase”是編寫測試中必不可少的一部分時&#xff0c; TestNG是作為JUnit 3的注釋驅動替代創建的測試框架。 即使現在&#xff0c;它也提供了一些有趣的功能&#xff0c;例如數據提供程序&#xff0c;并行測試或測試組。 在我們的測試不是從IDE執行的情況下&#xff…

gitee項目404問題_七款開源項目,讓你數據庫管理不再成為一個問題

在開發過程中&#xff0c;數據庫是必不可少的一環&#xff0c;但大多數情況下開發者們還是在用命令行來管理數據庫。雖然在外人看起來輸入一行行代碼非常的酷炫&#xff0c;但其中的繁瑣可能也只有開發者知道。七款開源項目&#xff0c;讓你數據庫管理不再成為一個問題今天 Git…

vb 窗體html表格,VB.Net – 高級表格

在本章中&#xff0c;讓我們研究以下概念 :在應用程序中添加菜單和子菜單在表單中添加剪切&#xff0c;復制和粘貼功能錨定和對接控件表格模態表格添加菜單和子菜單應用程序中的菜單傳統上&#xff0c;菜單&#xff0c;MainMenu&#xff0c;ContextMenu和MenuItem類用于在Windo…

SpringMVC后臺接收list類型的數據的實現方式

一、背景 最近在做一些東西的時候&#xff0c;遇到一個需要Springmvc后臺接收list類型數據的需求&#xff0c;幾經輾轉才完美解決了這個問題&#xff0c;今天記下來方便以后使用&#xff0c;也分享給需要的小伙伴們~ 二、實現方式 實現方式一 前端頁面 1 <% page language&q…

Maven集成測試和Spring Restful Services

介紹 我的原始博客通過一個非常簡單的示例展示了如何分離Maven單元和集成測試。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;許多人要求我提供比最初使用的示例更實際的示例。 這篇文章展示了如何在實際環境中&#…

玩cf出現outofmemory_CF畫質粗糙平衡感人,卻能歷經十年經久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火線》這款游戲國內運營時間已長達十年&#xff0c;從最早接觸這款游戲開始&#xff0c;很多玩家都在這里烙刻下了許多關于青春的回憶。CF的許多問題一直頗受詬病&#xff0c;例如落后且粗糙的畫質、英雄級武器與平民武器的巨大差距、千…

jquery遍歷ajax返回的json數據

我們以前在前端遍歷ajax拿到的數據一般都是用for或其他方式遍歷&#xff0c;這樣做麻煩且費事&#xff0c;效率不高&#xff0c;下面提供一個函數&#xff0c;只需調用函數即可把數據遍歷出來&#xff0c;方便高效。 html代碼&#xff1a; <html> <head><script…

Apache JMeter:隨心所欲進行負載測試

這是有關使用Apache JMeter進行負載測試的第二篇文章&#xff0c;請在此處閱讀第一篇文章&#xff1a; 有關對關系數據庫進行負載測試的分步教程。 JMeter有很多采樣器 。 如果您需要JMeter不提供的采樣器&#xff0c;則可以編寫自定義采樣器。 &#xff08;自定義采樣器在JMet…

html5歷史管理

在網易云課堂上看了妙味課堂的關于html5歷史管理的課程&#xff0c;在這里做一下筆記。 單頁面或ajax局部刷新的頁面中&#xff0c;沒有辦法通過前一步和后一步得到歷史訪問數據&#xff0c;此時有兩種方法可以解決這個問題&#xff1a; 1.onhashchange事件&#xff0c;示例代碼…