<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ThreadLocal是什么

jf_ro2CN3Fa ? 來源:CSDN ? 2023-01-30 11:36 ? 次閱讀


ThreadLocal是什么

ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高并發場景下,可以實現無狀態的調用,特別適用于各個線程依賴不通的變量值完成操作的場景。

下圖為ThreadLocal的內部結構圖

931b2958-9fb9-11ed-bfe3-dac502259ad0.png

從上面的結構圖,我們已經窺見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

932a8d58-9fb9-11ed-bfe3-dac502259ad0.png

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;
}
}

注意了??!

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的弱引用問題則不存在了。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 變量
    +關注

    關注

    0

    文章

    599

    瀏覽量

    28160
  • 線程
    +關注

    關注

    0

    文章

    496

    瀏覽量

    19537
  • Thread
    +關注

    關注

    2

    文章

    83

    瀏覽量

    25736

原文標題:ThreadLocal 搭配線程池使用造成內存泄漏的原因和解決方案

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LEM萊姆汽車級DHAB S/18霍爾電流傳感器介紹

    電子發燒友網站提供《LEM萊姆汽車級DHAB S/18霍爾電流傳感器介紹.docx》資料免費下載
    發表于 06-17 13:17 ?0次下載

    ACS724電流傳感器IC英文手冊

    電子發燒友網站提供《ACS724電流傳感器IC英文手冊.pdf》資料免費下載
    發表于 06-17 13:15 ?0次下載

    MDO3000系列混合域示波器用戶手冊

    電子發燒友網站提供《MDO3000系列混合域示波器用戶手冊.pdf》資料免費下載
    發表于 06-17 13:13 ?0次下載

    反激式參數詳細計算(含公式)

    反激式參數詳細計算(含公式)
    發表于 06-17 13:10 ?0次下載

    CCAN1042 CAN收發芯片規格書

    電子發燒友網站提供《CCAN1042 CAN收發芯片規格書.pdf》資料免費下載
    發表于 06-17 13:05 ?0次下載

    AMX8040A低內阻,高電壓,大電流高邊驅動IC

    電子發燒友網站提供《AMX8040A低內阻,高電壓,大電流高邊驅動IC.pdf》資料免費下載
    發表于 06-17 13:03 ?0次下載

    OCH2988單相無刷電機霍爾驅動芯片規格書

    電子發燒友網站提供《OCH2988單相無刷電機霍爾驅動芯片規格書.pdf》資料免費下載
    發表于 06-17 12:58 ?0次下載

    了解壓電傳感器:壓電效應

    壓電加速度計的個關鍵方面是壓電效應。一般來說,壓電材料在受到機械應力時可以產生電力。 相反,對壓電材料施加電場可以使其變形并產生小的機械力。盡管大多數電子工程師都熟悉壓電效應,但有時并沒有完全理解這種有趣現象的細節。 更深入地了解這種效應可以幫助我們更好地理解壓電傳感器的工作原理。圖 1 顯示了外部機械力對壓電材料的影響。 沒有機械應力 (a) 和有應力 (b) 的壓電材料。 圖 1.沒有機械應力 (a) 和有應力 (b) 的壓電材料。圖片(改編)由Felix Levinzon提供 如圖1(a)所示,在沒有機械應力的情況下,分子的負電荷和正電荷中心重合,這意味著分子呈電中性。 如圖 1(b) 所示,施加機械力會使結構變形并分離分子正負電荷的中心,在材料中產生許多小偶極子。 正如您所看到的,一些固定電荷出現在壓電材料的表面。產生的電荷量與施加的力成正比。 壓電材料如何產生電流 壓電材料是一類介電材料。它們是絕緣體或非常差的電流導體。然而,通過在壓電材料的相對表面上沉積兩個金屬電極,我們可以利用壓電效應產生的電場來發電。 如果我們通過電線將兩個電極連接在一起,如圖 1(b) 所示,導體中的自由電子就會流向帶正電的電極,并產生電流。該電流在正極上積聚自由電子,并在與壓電效應產生的原始場相反的方向上產生電場。 這種效應解釋了為什么靜力產生的電流只能持續很短的時間。電流持續存在,直到自由電子積累產生的電場抵消了壓電效應產生的電場。 現在,如果我們去除外力,材料恢復到原來的形狀,壓電效應產生的電場消失,這意味著相反方向的電流流過電線。 壓電加速度計的結構 在壓電加速度計中,壓電元件用于將已知質量(通常稱為檢驗質量)連接到加速度計主體。 當傳感器框架因外力而加速時,檢驗質量塊由于其慣性而傾向于“向后移動”并使壓電元件輕微變形。這使得壓電元件產生電荷輸出,可以測量該電荷輸出以確定輸入加速度。 圖 2 描述了壓電加速度計的一些常見機械設計。三種基本設計是壓縮模式、剪切模式和彎曲模式。 壓電加速度計的一些機械設計。 圖 2.壓電加速度計的一些機械設計。圖片(改編)由PCB Piezotronics提供 該圖還說明了檢驗質量施加在壓電元件上的力以及施加到傳感器主體上的加速度。
    發表于 06-17 11:59

    為什么我的電源會出現振鈴和過熱?

    本文旨在解決DC-DC開關穩壓器的功率級設計中面臨的復雜難題,重點分析 電感問題。設計人員為了獲得各種優勢,例如減少輸出紋波和盡量縮減解決方案尺寸,往往會選擇超出推薦范圍的電感值。然而,選擇電感值過大或過小的元件都會導致意想不到 的后果,可能會造成芯片嚴重損壞并降低效率。本文還將分析探討:如果不采取適當的措施,確保負載電流不會超過電感的最大飽和額定值,會出現什么情況。 什么是開關模式電源 SMPS是一種高效穩壓器,可降低輸入電壓(降壓轉換器)、升高輸入電壓(升壓轉換器),或同時執行這兩種操作(降壓-升壓轉換器)。圖1所示為基本開關轉換器拓撲。 圖1. 常見的SMPS拓撲及其輸出公式。 每個SMPS都以同樣的方式工作:將能量存儲在電感器中,并利用脈寬調制(PWM)技術來獲得所需的輸出。這些轉換器都應遵循伏秒平衡定律,即在穩態下工作時,電感在一個周期內的平均 電流必須為零。因此,電感器必須在另一個周期開始之前,將充電階段存儲的所有電流放電。 降壓轉換器操作 本文僅使用降壓轉換器來演示常見的設計錯誤。降壓轉換器的功率級由以下四個元件組成:電感器、輸出電容器、頂部FET(由開關表示)和底部FET(由二極管表示),見圖2。 圖2. 簡化的降壓轉換器功率級。 電感器兩端的電壓通過以下公式計算:VL = L di L /dt。該電壓是開 關節點與輸出電壓之間的差值。當頂部FET導通時,VL 是輸入電壓和輸出電壓之間的差值。當頂部FET關斷時,由于開關節點接地,因此差值為0 V減去輸出。di L /dt (或 Δi L ) 是電感電流隨時間的變化量,通常稱為電感電流紋波。當頂部FET閉合(底部FET斷開)時,隨著流經電感器的電流增加,電感器以磁通量的形式存儲能量。當頂部FET斷開,磁場消失時,底部FET會形成接地路徑,從而使電流在減小時仍能夠流向負載。圖3所示的電感電流波形中可以看出這一點。輸出電容用于獲得平穩的輸出紋波,并協助保持所需的輸出電壓。降壓轉換器的輸出電壓由V~ OUT~ = DV~ IN~得出,其中D是占空比,定義為頂部FET導通并對電感器充電的時間占總周期時間的百分比。 圖3. 電感電流波形。當頂部FET導通時,流經電感器的電流充電;當頂部FET關斷時,流經電感器的電流放電。 推薦的電感器尺寸 在設計SMPS時,必須選擇正確的電感值,以確保電感電流紋波(Δi L ))在可接受范圍內。建議降壓轉換器的電感紋波應介于所施加負載電流的30%至40%之間。通常認為此范圍比較理想,既足以捕獲準確的信號并將其傳送到電流模式控制反饋系統,又不會過大,導致電源進入斷續導通模式(DCM)。DCM是一種狀態,在該狀態下,因電流紋波太大而迫使電流低于0 A,以便將負載電流維持在所需值。然而,一旦達到0 A,FET內部的二極管就不再導 通,從而防止電流降至0 A以下。一般基于以下公式來正確選擇電感: 此公式表明,開關頻率與電感成反比,這意味著頻率越高,充電時間就越短,從而可以使用更小的電感實現正常操作(節省占用空間和成本)。 電感器飽和 在SMPS設計中,常見的一種災難性錯誤就是在選擇功率電感時忽略了電流飽和額定值。當流經電感的電流超過飽和電流額定值時,電感器鐵芯飽和,這意味著產生的磁場將不再與消耗的 電流成比例地增加。這會破壞伏秒平衡定律,導致電感電流紋波和輸出電壓紋波失去線性特性。當鐵芯飽和時,電感值會迅速降低,其行為更像電阻而不是電感。由于電感器的有效串 聯電阻(ESR)增加,而實際電感減小,因此,為了滿足伏特秒平衡,電流變化量將被迫增加。在飽和電流波形中觀測到尖峰是電流斜率呈指數增加造成的,如圖4所示。該電流尖峰會影響輸 出電壓,從而導致更多噪聲和電壓尖峰,如圖5所示。如果電壓尖峰過大,超過下游元件的最大電壓額定值,噪聲和電壓尖峰可能會損壞下游元件,并降低EMI性能。 圖4. 飽和電感電流波形。波形在電流超過飽和額定值之前表現正常。 圖5. 飽和電感輸出紋波。尖峰會延續到輸出,其中包含噪聲和電壓尖峰。 此外,在電流波動較大的情況下,電感器會經歷快速磁滯損耗,從而導致電感器散熱過多(如圖6所示)并產生可聞噪聲。過多的熱量可能會損壞附近的其他元件(尤其是穩壓器芯片本身)。 圖6. 電感器飽和散熱溫度為226°F (107.78°C)。 為避免出現此問題,設計人員應選擇額定電流至少比預期最大電流高兩倍的電感器。在計算最大電流時,一定要考慮電感電流紋波以及輸出端消耗的負載電流。此外,設計人員還可以參 考所選電感器的數據手冊,了解在多大電流下電感值會降低10%到30%,這就是飽和的定義。選擇具有適當飽和電流額定值的電感器將會使系統正常運行,如圖7中流經電感器的線性電流所 示。輸出電壓尖峰將會消失,如圖8所示。最后,系統將在更低的溫度下運行(如圖9所示),從而減少對設備的影響并延長設備的使用壽命。 圖7. 標稱電感電流波形。 圖8. 標稱電感輸出紋波。 圖9. 標稱電感散熱溫度為99.7°F ( 37.61°C)。 超小電感器面臨的難題 設計人員通常為了節省占用空間更傾向選擇電感值較小的電感,這樣的電感器線圈數量較少,因此外形尺寸較小。然而,如果電感器太小,紋波電流就會很大,并會迫使轉換器進入DCM模式,這對于SMPS來說是不可取的,因為器件的效率會降低,電磁干擾(EMI)性能也會變差。當開關節點出現振鈴時,可能會觀測到這種EMI性能下降現象,這是由寄生效應和LC諧振電路(產生諧振電路)引起的,如圖10所示。這種振鈴會影響輸出電壓,從而導致更大的紋波和更多的電壓尖峰,如圖11所示。此外,電源不再處于連續導通模式(CCM),并且推導出的SMPS輸出公式不再適用。 圖10. 超小電感輸出波形。如果無法獲得電感電流,也會在開關節點處觀測到振鈴現象。 圖11. 超小電感電流波形。電流和RSENSE中出現振鈴表明電源處于DCM模式。 為了解決此問題,設計人員應選擇能夠提供約30%至40%電流紋波的電感。這樣就會降低電感電流紋波的幅度,使器件從DCM返回CCM模式,如圖12所示。這也會改善輸出電壓紋波,消除電壓尖峰,如圖8所示。如果設計人員在計算所需電感值和選擇適用元件時遇到困難,可以使用LTPowerCAD 來協助設計和選擇功率級元件。 圖12. 標稱電感電流波形。 超大電感器面臨的難題 連接到SMPS的下游電子元件通常具有指定的電源電壓和相關容差。如果電壓軌上的紋波過大,將嚴重影響系統的運行。例如,如果微控制器的電源規格為3.3 V ±50 mV,則紋波大于±50 mV可能會導致微控制器關閉。設計人員一般通過增加電感器的尺寸來減少 這種紋波。然而,如果電感器尺寸過大,電流紋波以及輸出電壓紋波會顯著減少。盡管這聽起來可取,但它會導致反饋系統出現問題,而且還會導致瞬態響應變慢。小紋波將使串聯檢測電阻很難檢測到變化,從而使傳遞到反饋環路的常見三角波形失真。當電感電流紋波較小時,信噪比(SNR)會降低。這會導致反饋環路將噪聲記錄為電感器信號,從而導致輸出信號不穩定(表現為抖動),如圖13所示。 圖13. 輸出不穩定造成抖動。超大電感輸出波形表現出持續特性。突出顯示的波形采用標稱電感捕獲。 此外,電感值越大,飽和電流額定值通常越小。這可能會導致電感飽和,對于器件而言非常危險,如\"電感器飽和\"部分所述。超大電感飽和帶來的影響如圖14所示。 圖14. 電感值為標稱值22倍的電感器的飽和電感輸出波形。額定電流不會隨電感成比例增加。 為了緩解此問題,設計人員切記,輸出電壓紋波可通過改變輸出電容選擇來控制。通過增加輸出電容器的值或降低其ESR,可以減少輸出電壓紋波,而無需增加電感器的值。這樣電感電流紋波值保持在30%到40%之間,從而使檢測架構能夠正確獲取信號。這一點可以從圖15中看出。 圖15. 標稱檢測電阻波形。 結論 本文可作為分析降壓轉換器中電感器設計問題的指南。此外,本文旨在為設計人員提供實用解決方案,避免出現文中所述的任何干擾行為。通過適當調整電感大小,將電感紋波保持在輸出的30%至40%范圍內,對于確保器件保持在CCM狀態,并且不會引起干擾抖動或飽和至關重要,這種抖動或飽和可能會對負載或穩壓器芯片本身造成致命影響
    發表于 06-17 11:57

    ThreadLocal基本內容與用法

    下面我們就來看看道哥都用的ThreadLocal。 1 ThreadLocal你來自哪里 Since : 1.2 Author : Josh Bloch and Doug Lea 又是并發大佬
    的頭像 發表于 10-13 11:39 ?302次閱讀

    ThreadLocal實例應用

    ThreadLocal相信大家都用過,但你知道他的原理嗎,今天了不起帶大家學習ThreadLocal。 ThreadLocal是什么 在多線程編程中,經常會遇到需要在不同線程中共享數據的情況
    的頭像 發表于 09-30 10:19 ?503次閱讀
    <b class='flag-5'>ThreadLocal</b>實例應用

    ThreadLocal的定義、用法及優點

    ThreadLocal 簡介 ThreadLocal是Java中一個非常重要的線程技術。它可以讓每個線程都擁有自己的變量副本,避免了線程間的競爭和數據泄露問題。在本文中,我們將詳細介紹
    的頭像 發表于 09-30 10:14 ?564次閱讀
    <b class='flag-5'>ThreadLocal</b>的定義、用法及優點

    ThreadLocal的短板,我TTL來補!

    然后還有一步,也挺關鍵的,就是恢復線程池內部執行線程的上下文,也就是該任務執行完畢之后,把任務帶來的本地數據給刪了,把線程以前的本地數據復原。
    的頭像 發表于 09-27 16:22 ?445次閱讀
    <b class='flag-5'>ThreadLocal</b>的短板,我TTL來補!

    什么是ThreadLocal?一文讓你徹底掌握ThreadLocal

    我們都知道,在多線程環境下訪問同一個共享變量,可能會出現線程安全的問題,為了保證線程安全,我們往往會在訪問這個共享變量的時候加鎖,以達到同步的效果,如下圖所示。
    的頭像 發表于 08-07 11:39 ?1053次閱讀
    什么是<b class='flag-5'>ThreadLocal</b>?一文讓你徹底掌握<b class='flag-5'>ThreadLocal</b>

    126.126 尚硅谷 SparkCore 工程化代碼 架構模式 ThreadLocal

    代碼
    充八萬
    發布于 :2023年07月19日 03:27:25
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>