ThreadLocal是什么
ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高并發場景下,可以實現無狀態的調用,特別適用于各個線程依賴不通的變量值完成操作的場景。
下圖為ThreadLocal的內部結構圖
從上面的結構圖,我們已經窺見ThreadLocal的核心機制:
-
每個Thread線程內部都有一個Map。
-
Map里面存儲線程本地對象(key)和線程的變量副本(value)
-
但是,Thread內部的Map是由ThreadLocal維護的,由ThreadLocal負責向map獲取和設置線程的變量值。
所以對于不同的線程,每次獲取副本值時,別的線程并不能獲取到當前線程的副本值,形成了副本的隔離,互不干擾。
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
-
項目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
視頻教程:https://doc.iocoder.cn/video/
ThreadLocalMap
ThreadLocalMap是ThreadLocal的內部類,沒有實現Map接口,用獨立的方式實現了Map的功能,其內部的Entry也獨立實現。
和HashMap的最大的不同在于,ThreadLocalMap結構非常簡單,沒有next引用,也就是說ThreadLocalMap中解決Hash沖突的方式并非鏈表的方式,而是采用線性探測的方式。(ThreadLocalMap如何解決沖突? )
在ThreadLocalMap中,也是用Entry來保存K-V結構數據的。但是Entry中key只能是ThreadLocal對象,這點被Entry的構造方法已經限定死了。
staticclassEntryextendsWeakReference<ThreadLocal>{
/**ThevalueassociatedwiththisThreadLocal.*/
Objectvalue;
Entry(ThreadLocalk,Objectv){
super(k);
value=v;
}
}
注意了?。?/p>
Entry繼承自WeakReference(弱引用,生命周期只能存活到下次GC前),但只有Key是弱引用類型的,Value并非弱引用。(問題馬上就來了)
由于ThreadLocalMap的key是弱引用,而Value是強引用。這就導致了一個問題,ThreadLocal在沒有外部對象強引用時,發生GC時弱引用Key會被回收,而Value不會回收。
當線程沒有結束,但是ThreadLocal已經被回收,則可能導致線程中存在ThreadLocalMap
的鍵值對,造成內存泄露。(ThreadLocal被回收,ThreadLocal關聯的線程共享變量還存在)。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
-
項目地址:https://github.com/YunaiV/yudao-cloud
-
視頻教程:https://doc.iocoder.cn/video/
如何避免泄漏
為了防止此類情況的出現,我們有兩種手段。
1、使用完線程共享變量后,顯示調用ThreadLocalMap.remove
方法清除線程共享變量;
既然Key是弱引用,那么我們要做的事,就是在調用ThreadLocal的get()
、set()
方法時完成后再調用remove方法,將Entry節點和Map的引用關系移除,這樣整個Entry對象在GC Roots分析后就變成不可達了,下次GC的時候就可以被回收。
2、JDK建議ThreadLocal定義為private static
,這樣ThreadLocal的弱引用問題則不存在了。
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
原文標題:ThreadLocal 搭配線程池使用造成內存泄漏的原因和解決方案
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
相關推薦
當地時間1月21日,歐洲汽車制造商協會公布了2024年歐洲31個國家和地區的純電動汽車銷售數據,該年度純電動汽車銷量為199萬3102輛,相比2023年同比減少了1%,這也是歐洲純電動汽車年度銷量首次出現同比下降。 從各主要市場表現來看,德國作為歐洲曾經最大的電動汽車市場,由于2023年12月全面停止了購車補貼,該國去年純電動汽車銷量為380609輛,同比下降27%。法國將亞洲生產的純電動汽車排除在補貼之外,去年純電動汽車銷量為290614輛,同比下降3%。
發表于 01-23 11:50
?44次閱讀
對硬盤、固態硬盤和 USB 驅動器上的所有數據進行消毒。無需每次擦除成本! 功能強大的便攜式軟件,可銷毀硬盤、固態硬盤(SSD)、USB 磁盤和存儲卡上的所有數據,排除任何恢復已刪除文件和文件夾數據的可能性。 Active@ KillDisk 是一款磁盤清理和分區清除工具,支持美國國防部 5220.22-M 和 20 多個國際數據清理標準。 · 添加了擦除方法 IEEE Std 2883-2022 和 NIST 800-88 rev.1 · 錯誤修復和穩定性改進 · 最新內核包括錯誤修復和改進 · 改進的啟動盤創建器:將預
發表于 01-23 11:46
?37次閱讀
比亞迪汽車宣布,已面向2025款漢家族汽車首批內測用戶OTA推送新版本。 此次升級包含5項新增功能、6項優化體驗。新增功能方面,城市領航功能亮點十足,智駕領航狀態下車輛可實時識別紅綠燈,自動剎車、起步。還能實現全場景繞行與禮讓、車道線混亂/無車道線道路通行、智慧禮讓大車、明暗交替和逆光炫光通行以及環島行駛等功能。 此外,新增了代客泊車功能,可精準自主入庫。同時,增加了手機藍牙車鑰匙、遙控駕駛、遙控泊車等功能授權,以
發表于 01-23 11:45
?48次閱讀
春節停工停產前,進行一次全面的電氣巡檢項目可以幫助發現潛在的問題并采取相應的措施,以確保設備在停工期間得到充分的維護和修理,杜絕安全隱患。
發表于 01-23 11:44
?38次閱讀
Elon Musk再次對無人駕駛出租車夸下???。 十多年來,涉足自動駕駛汽車的各公司均遇到了遠超最初預期的難題。因此,該領域遍布著半途而廢的項目。 盡管競爭對手接連折戟,特斯拉本身也屢次未能如期推出自動駕駛出租車,但其決心似乎并未動搖。在加州伯班克華納兄弟影城舉辦的“We, Robot”發布會現場,Elon Musk發布了兩款專用無人駕駛出租車,并公布了其最新上市時間。 第一款車型為CyberCab兩座無人駕駛出租車。這款小型自動駕駛汽車融合了Cy
發表于 01-23 11:43
?49次閱讀
在裝備制造這一復雜而關鍵的工業領域,高精度測溫儀和溫度傳感器的應用猶如精準的導航系統,為生產過程保駕護航,對提升產品質量和生產效率有著不可替代的作用。
發表于 01-23 11:42
?39次閱讀
全球連接與傳感領域領軍企業TE Connectivity (TE) 新推出的ELCON Micro線到板電源解決方案升級系統載流能力,該解決方案采用3.0mm的標準工業封裝,各引腳提供的電流高達12.5A。利用標準封裝,可輕松升級到現有的設計,并使現有接頭和電纜插頭封裝能夠兼容其他供應商的產品。定制的電纜組件完善了大電流產品組合,并可提供設計靈活性。
TE的ELCON MICRO線到板是采用常用的 3.0mm(端子間距)工業封裝,每個引腳的電流密度高達 12.5A,將不同線規與2到24針配置進行多種組合,支持不同電流。常用的工業封裝可輕松升級已有設計,PCB封裝與其他供應商兼容,更便于客戶進行裝配。該組合產品的最高工作溫度可達到105°C,并采用無鹵素材料,因此能夠在嚴苛環境中確保性能的可靠性。新型電纜插頭和自定義電纜組件可提高設計靈活性。
作為TE的授權分銷商,Heilind可為市場提供相關服務與支持,此外Heilind也供應多家世界頂級制造商的產品,涵蓋25種不同元器件類別,并重視所有的細分市場和所有的顧客,不斷尋求廣泛的產品供應來覆蓋所有市場。
關于赫聯電子(Heilind Electronics):
Heilind Electronics(赫聯電子)創立于1974年,全球總部位于美國波士頓,已在中國,新加坡,美國,德國,巴西,加拿大和墨西哥設立了超過40處分部。Heilind為電子行業各細分市場的原始設備制造商和合約制造商提供支持,供應來自業界頂尖制造商的產品,涵蓋25個不同元器件類別,并特別專注于互連與機電產品。其主要分銷產品包括互連器件、繼電器、風扇、開關、散熱解決方案、套管和線束產品、晶體與振蕩器、緊固件與五金件,傳感器等。
發表于 01-23 11:42
TE完整的 D-Subminiature 連接器系列從直角和垂直柱式連接器、電纜連接器到 AMPLIMITE 0.050 系列 D-Sub 連接器,應有盡有。TE的 D-Subminiature 連接器產品組合為多種應用而設計,帶有專用附件,能夠為任意客戶提供適合任意復雜應用的經濟型 d-sub 解決方案。
產品特點:
1、D-Subminiature 連接器系列從直角和垂直 PCB 連接器到 AMPLIMITE 0.050 系列 D-Sub 連接器,品種齊全。
2、D-Subminiature 連接器產品組合適合多種應用,帶有專用附件,能夠為任何客戶提供適合任意復雜應用的經濟型 D-Sub 解決方案。
3、AMPLIMITE D-Subminiature 連接器符合 MIL-DTL-24308 規格。
4、產品組合包括 AS39029 接觸件以及同軸接觸件和電源接觸件。
作為TE的授權分銷商,Heilind(赫聯電子)可為市場提供相關服務與支持,此外Heilind(赫聯電子)也供應多家世界頂級制造商的產品,涵蓋25種不同元器件類別,并重視所有的細分市場和所有的顧客,不斷尋求廣泛的產品供應來覆蓋所有市場。
關于赫聯電子(Heilind Electronics):
Heilind Electronics(赫聯電子)創立于1974年,全球總部位于美國波士頓,已在中國內地,香港,新加坡,美國,德國,巴西,加拿大和墨西哥設立了超過40處分部。Heilind為電子行業各細分市場的原始設備制造商和合約制造商提供支持,供應來自業界頂尖制造商的產品,涵蓋25個不同元器件類別,并特別專注于互連與機電產品。其主要分銷產品包括互連器件、繼電器、風扇、開關、電路保護與熱管理、套管和線束產品、晶體與振蕩器、緊固件與硬件,傳感器等。
發表于 01-23 11:41
領慧立芯LHAMP1528精密運算放大器產品介紹
發表于 01-23 11:37
?37次閱讀
導讀在嵌入式系統設計中,散熱是影響處理器性能與穩定性的關鍵問題。本文聚焦于高端嵌入式處理器的散熱設計,探討核心板的熱設計與系統級熱設計方法,以及導熱材料和布局的建議,為解決高溫問題提供參考。用高端嵌入式處理器設計系統,散熱是一個避不開的問題。就算標稱工業級處理器,在進行環境溫度實測的時候,都需要加散熱片才能通過。在不加散熱器的情況下,處理器的結溫和環溫,一般
發表于 01-23 11:36
?31次閱讀
隨著汽車行業向智能化、電動化和網聯化加速發展,傳統12V電氣系統因輸出功率有限,難以滿足商用車、工業設備、機器人及飛機等多樣化應用場景對功率的日益增長需求。當下,行業已逐步邁向24V乃至48V系統,以適配不斷演進的技術要求與實際應用需求。在此背景下,穩先微電子有限公司重磅推出WST6系列智能高邊開關芯片,專為24V電控平臺設計,兼容擴展至48V,為客戶提供高性能、高可靠性的解決方案。
發表于 01-23 11:35
?42次閱讀
捷豹路虎(JLR)與塔塔通信(Tata Communications)近日宣布加強合作,共同打造更加智能互聯的汽車體驗。雙方將通過Tata Communications的MOVE?平臺,進一步增強JLR的互聯汽車生態系統,為全球客戶帶來前所未有的駕駛感受。 此次合作的核心在于,借助Tata Communications的先進技術,JLR的下一代軟件定義汽車將實現持續穩定的網絡連接。無論是在繁華都市還是偏遠鄉村,覆蓋120個國家/地區的廣泛網絡,都能確保駕駛者隨時隨地訪問各種智能服務。 這一最新合作不僅是
發表于 01-23 11:34
?42次閱讀
介紹了一種適用于地面遙感或無人機測繪的輕質量、小體積雙偏振L波段輻射計。在ESA土壤濕度和海洋鹽度(SMOS)和NASA土壤濕度上有突出的應用主被動(SMAP)衛星的L波段輻射測量可用于反演環境參數,包括土壤濕度、海面鹽度、雪中液態水含量、雪密度、植被光學深度等。介紹了氣隙貼片陣列天線的設計和測試,并顯示可提供37°的3db全功率波束寬度。我們提出了射頻(RF)前端設計,它采用直接檢測架構和平方律功率檢測器。校準使用兩個內部參考,包括在環境溫度下的匹配電阻源(RS)和有源冷源(ACS)。射頻(RF)前端不需要溫度穩定,因為通過天空測量表征ACS噪聲溫度。介紹了ACS的表征過程。在1 s積分時,輻射計的噪聲等效Δ (Δ)溫度(NEΔT)為~0.14 K。天線總溫度不確定度范圍為0.6 ~ 1.5 K。
發表于 01-23 11:34
?43次閱讀
作為單片機開發愛好者,在平時調試代碼和復現程序bug時,一定會使用到LOG日志打印輸出,一般我們都會選擇串口printf打印來處理,但是對于某些MCU單片機子來說,為了節省成本,會不使用串口USB轉232/485芯片,這時就無法通過板載的串口來打印log了,此時一般工程師會選擇掛TTL串口調試模塊來調試串口。
但是這種方法必須要有TTL串口調試模塊才行,如果此時手上沒有這個模塊,是不是就只能干瞪眼了??????
當然不行啊,剛好JLINK自帶的RTT就能彌補這個缺陷,它能進行串口printf打印的所有功能。
本期測評就讓我來給大家講解一下使用JLINK的RTT實現printf打印的功能集成和實現!
大家安裝JLINK后,定位到里面的安裝目錄
把它解壓后拷貝到別的文件夾中
加壓后會發現一下幾個文件
把這個文件夾復制到我上篇流水燈工程文件夾里
然后打開keil工程
添加RTT路徑到KEIL
hal_entry.c添加如下頭文件
#include \"hal_data.h\"
#include \"RTT.h\"
在LED1和LED2代碼里添加打印功能
void led1_flicker(void)
{
LED1_lighting_up;
R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
printf(\"LED1 liang 100 ms\\\\r\\\\n\");
LED1_lighting_off;
R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
printf(\"LED1 mie100 ms\\\\r\\\\n\");
}
void led2_flicker(void)
{
LED2_lighting_up;
R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
printf(\"LED2 liang 100 ms\\\\r\\\\n\");
LED2_lighting_off;
R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
printf(\"LED2 mie100 ms\\\\r\\\\n\");
}
打開JLINK RTT View
選擇芯片型號
R7FA2L1A9
燒錄代碼到板子
打開JLINK RTT View
可以看到打印log,完全和我封裝到LED1和LED2里的功能一致,
支持完成了JLINK RTT printf串口輸出打印功能?。。?詳細細節請看視屏,,下一節講解板載的串口打印輸出功能?。。。?
發表于 01-23 11:33
零刻科技近日正式預告了新款SER9 Pro迷你電腦主機,引發了科技愛好者的廣泛關注。 去年9月,零刻推出了搭載AMD銳龍AI 9 HX 370處理器的SER9迷你主機,如今這款升級版的SER9 Pro將搭載AMD銳龍AI 9 365處理器。AMD銳龍AI 9 365集成了12CU 2900MHz的RDNA 3.5核顯Radeon 880M,圖形處理能力更上一層樓。 同時,新款SER9 Pro還配備了LPDDR5X - 8000內存,相比原版的7500MHz板載內存,能更快速高效地處理多任務和大型應用。 外觀方面,SER9 Pro提供四色可選,滿足不同用戶的個性化審美
發表于 01-23 11:33
?41次閱讀
評論