ThreadLocal介紹

文章目錄

  • ThreadLocal
    • 源碼分析:
      • set方法
      • get方法
      • remove方法
    • ThreadLocal內存泄漏問題

ThreadLocal

ThreadLocal提供了線程局部變量,每個線程都可以通過set和get方法來對這個變量進行操作,但不會和其他線程的局部變量沖突,實現了線程的數據隔離

源碼分析:

set方法

public void set(T value) {Thread t = Thread.currentThread();//getMap就是為了獲取當前線程的ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null)//如果map存在就直接以這個ThreadLocal為鍵,設置鍵和值map.set(this, value);else//否則就為他創建一個ThreadLocalMap,并設置第一個鍵和值createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {return t.threadLocals;
}
void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);
}

get方法

public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {//如果當前線程的ThreadLocalMap存在,就嘗試獲取對應鍵值對ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}//如果threadLocals不存在或者當前的ThreadLocal不存在于這個map中return setInitialValue();
}
private T setInitialValue() {T value = initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)//當前ThreadLocal不存在于map中,就加上,設置value為空map.set(this, value);else//如果map不存在就創建,并設置鍵值createMap(t, value);return value;
}
protected T initialValue() {return null;
}

remove方法

public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());if (m != null)m.remove(this);
}
private void remove(ThreadLocal<?> key) {Entry[] tab = table;int len = tab.length;int i = key.threadLocalHashCode & (len-1);for (Entry e = tab[i];e != null;e = tab[i = nextIndex(i, len)]) {if (e.get() == key) {//弱引用中的清除方法e.clear();//將key為null的鍵值對清除掉,get和set方法底層也有用到expungeStaleEntry(i);return;}}
}
private static int nextIndex(int i, int len) {return ((i + 1 < len) ? i + 1 : 0);
}

總結:

可以看出,ThreadLocal中并不存儲值,只是作為一個key來讓線程從ThreadLocalMap中獲取value,從而實現了線程之間的數據隔離

  • 每個線程都維護著一個ThreadLocalMap,ThreadLocalMap是ThreadLocal的內部類
  • ThreadLocal中的set,實際上是向當前線程的ThreadLocalMap中設置值,鍵為創建的ThreadLocal對象

ThreadLocal內存泄漏問題

內存泄漏:程序中間動態分配了內存,但在程序結束時沒有釋放這部分內存,從而造成那部分內存不可用的情況

內存溢出:要求分配的內存超過了系統能給的

ThreadLocal中作為map中的key使用,而且ThreadLocalMap中的key是弱引用,弱引用對象在gc時會被回收,而ThreadLocalMap和Thread的生命周期一樣長,就會存在key為null的情況,value訪問不到,從而引發內存泄漏。所以,使用ThreadLocal時最后最好調用remove方法顯式調用expungeStaleEntry方法手動刪除key為null的value,防止value的積累

ThreadLocal的get和set方法某些時候也會調用expungeStaleEntry方法,但這是不及時的,而且不一定每次都會執行

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

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

相關文章

Doris實戰——拈花云科的數據中臺實踐

目錄 前言 一、業務背景 二、數據中臺1.0—Lambda 三、新架構的設計目標 四、數據中臺2.0—Apache Doris 4.1 新架構數據流轉 4.2 新架構收益 五、新架構的落地實踐 5.1 模型選擇 5.1.1 Unique模型 5.1.2 Aggregate模型 5.2 資源管理 5.3 批量建表 5.4 計算實現…

Stable Diffusion 模型分享:Realistic Stock Photo(真實的庫存照片)

本文收錄于《AI繪畫從入門到精通》專欄&#xff0c;專欄總目錄&#xff1a;點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下載地址 模型介紹 條目內容類型大模型基礎模型SDXL 1.0來源CIVITAI作者PromptSharingSamaritan文件名稱reali…

原生GO開發的博客系統

Go博客實戰教程&#xff0c;是一個練手級項目教程&#xff0c;使用原生Go開發&#xff0c;未使用任何框架。 如何使用原生Go開發一個web項目 循序漸進&#xff0c;掌握編程思維和思路 初步具有工程思維&#xff0c;能適應一般的開發工作 1. 搭建項目 package mainimport (&q…

Vue3_2024_1天【Vue3創建和響應式,對比Vue2】

前言&#xff1a; Vue3對比Vue2版本&#xff0c;它在性能、功能、易用性和可維護性方面都有顯著的提升和改進。 性能優化&#xff1a;模板編譯器的優化、對Proxy的支持以及使用了更加高效的Virtual DOM算法等。這使得Vue3的打包大小減少了41%&#xff0c;初次渲染提速55%&#…

【MATLAB源碼-第153期】基于matlab的OFDM系統插入導頻和訓練符號兩種信道估計方式誤碼率對比仿真。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交頻分復用&#xff09;是一種高效的無線信號傳輸技術&#xff0c;廣泛應用于現代通信系統&#xff0c;如Wi-Fi、LTE和5G。OFDM通過將寬帶信道劃分…

使用docker方式測試部署django項目(客戶催)

需求 1&#xff1a;已有django項目–weidanyewu 2&#xff1a;希望在服務器上測試部署–客戶催 3&#xff1a;沒完善django的啟動 4&#xff1a;使用臨時數據庫進行演示 5&#xff1a;使用python3.10版本鏡像 6&#xff1a;展示端口80 7&#xff1a;后臺執行django程序 8&#…

【C語言】熟悉文件順序讀寫函數

前言 本篇詳細介紹了 文件順序讀寫常用函數&#xff0c;快來看看吧~ 歡迎關注個人主頁&#xff1a;逸狼 創造不易&#xff0c;可以點點贊嗎~ 如有錯誤&#xff0c;歡迎指出~ 目錄 前言 ?編輯 文件順序讀寫函數 fgetc函數 示例 fputc函數 逐個字符寫入 寫入26個字母 文…

手寫模擬器,解放雙手!效果炸裂的生產工具

手寫模擬器是一款基于Handright的仿手寫圖片生成軟件&#xff0c;可以讓你的電腦和手機也能寫出漂亮的手寫字&#xff0c;你只需要輸入你想要寫的內容&#xff0c;選擇你喜歡的字體和背景&#xff0c;就可以生成一張高仿真的手寫圖片&#xff0c;用于各種場合&#xff0c;比如做…

uniapp中canvas的基礎使用

canvas簡介 canvas是uniapp中提供的一個組件,用于生成自定義的圖形界面。通過canvas,我們可以通過JavaScript代碼在頁面上繪制各種圖形和圖像。 使用canvas 在頁面中添加canvas 首先需要在頁面的template中添加一個canvas組件: <template><view><canvas ca…

linux:iostat 用法詳解

文章目錄 描述語法參數例子 描述 iostat 是一個在類Unix操作系統中常用的系統監控工具&#xff0c;尤其是Linux系統中&#xff0c;它主要用于收集和報告中央處理器(CPU)使用情況以及磁盤輸入/輸出(I/O)統計數據。以下是 iostat 命令的基本用法及其參數詳解&#xff1a; 語法 …

代碼隨想錄三刷 day11 | 棧與隊列之 20. 有效的括號 1047. 刪除字符串中的所有相鄰重復項 150. 逆波蘭表達式求值

三刷day11 20. 有效的括號1047. 刪除字符串中的所有相鄰重復項150. 逆波蘭表達式求值 20. 有效的括號 題目鏈接 解題思路&#xff1a; 有三種不匹配的情況&#xff1a; 第一種情況&#xff0c;字符串里左方向的括號多余了 。 第二種情況&#xff0c;括號沒有多余&#xff0c;…

[伴學筆記]01-操作系統概述 [南京大學2024操作系統]

文章目錄 前言jyy:01-操作系統概述 [南京大學2024操作系統]為什么要學操作系統?學習操作系統能得到什么? 什么是操作系統?想要明白什么是操作系統:時間線:1940s1950s-1960s1960-1970s年代. 信息來源: 前言 督促自己,同時分享所得,閱讀完本篇大約需要10分鐘,希望為朋友的技術…

編碼規則轉換

思考&#xff1a; 如何將一個機內碼轉換為區內碼&#xff1f; 只要將機內碼減去 A0A0 就可以啦 如果只讓我們用加法器來解決呢&#xff1f; 注意我們的數據占用了 32 位&#xff0c;如果想用補碼進行減法運算的話&#xff0c;符號位怎么辦&#xff1f;&#xff1f;&#xf…

《探索數據結構之美:如何高效實現哈希表》

摘要&#xff1a;哈希表是一種基于鍵值對的數據結構&#xff0c;它通過哈希函數將鍵映射到表中一個位置&#xff0c;以實現快速的插入、刪除和查找操作。在本期播客中&#xff0c;我們將深入剖析哈希表的數據結構&#xff0c;分享如何用Python語言實現一個哈希表項目。此外&…

【深度學習筆記】計算機視覺——微調

微調 前面的一些章節介紹了如何在只有6萬張圖像的Fashion-MNIST訓練數據集上訓練模型。 我們還描述了學術界當下使用最廣泛的大規模圖像數據集ImageNet&#xff0c;它有超過1000萬的圖像和1000類的物體。 然而&#xff0c;我們平常接觸到的數據集的規模通常在這兩者之間。 假…

【計算機是怎么跑起來的】軟件,體驗一次手工匯編

【計算機是怎么跑起來的】軟件,體驗一次手工匯編 二進制機器語言匯編語言操作碼操作數寄存器內存地址和I/O地址參考書:計算機是怎么跑起來的 第三章外設在路上。。。先整理一下本書涉及的理論知識,反正后面做視頻也要重寫QAQ 程序的作用是驅動硬件工作,所以在編寫程序之前必…

【C++庖丁解牛】類與對象

&#x1f4d9; 作者簡介 &#xff1a;RO-BERRY &#x1f4d7; 學習方向&#xff1a;致力于C、C、數據結構、TCP/IP、數據庫等等一系列知識 &#x1f4d2; 日后方向 : 偏向于CPP開發以及大數據方向&#xff0c;歡迎各位關注&#xff0c;謝謝各位的支持 目錄 1.面向過程和面向對象…

對單例模式的餓漢式、懶漢式的思考

目錄 1 什么是單例模式&#xff1f;1.1 什么是餓漢式&#xff1f;1.2 什么是懶漢式&#xff1f; 2 我對餓漢式的思考3 懶漢式3.1 解決懶漢式的線程安全問題3.1.1 加鎖&#xff1a;synchronized&#xff08;synchronized修飾靜態方法&#xff09;3.1.2 對“3.1.1”性能的改進 1 …

環形鏈表詳解(讓你徹底理解環形鏈表)

文章目錄 一.什么是環形鏈表&#xff1f;二.環形鏈表的例題&#xff08;力扣&#xff09; 三.環形鏈表的延伸問題 補充 一.什么是環形鏈表&#xff1f; 環形鏈表是一種特殊類型的鏈表數據結構&#xff0c;其最后一個節點的"下一個"指針指向鏈表中的某個節點&#xff…

Python 教學平臺,支持“多班教學”的課程授課方式|ModelWhale 版本更新

龍行龘龘、前程朤朤&#xff0c;ModelWhale 新一輪的版本更新&#xff0c;期待為大家帶來更優質的使用體驗。 本次更新中&#xff0c;ModelWhale 主要進行了以下功能迭代&#xff1a; 新增 課程&#xff08;包括課件、作業、算力&#xff09;按班級管理&#xff08;團隊版? …