java ThreadLocal源碼分析

寫個demo測試下:

private static void testThreadLocal() {ThreadLocal<Integer> threadLocal = new ThreadLocal<>();new Thread(){@Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " + Thread.currentThread().getName() + ", set 9527");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("curr thread: " + Thread.currentThread().getName() + ", getValue: " + threadLocal.get());}}.start();new Thread(){@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}threadLocal.set(250);System.out.println("curr thread: " + Thread.currentThread().getName() + ", set 250");System.out.println("curr thread: " + Thread.currentThread().getName() + ", getValue: " + threadLocal.get());}}.start();}

打印:

可以看出,同一個ThreadLocal對象,在不同的線程中設置值和取值互不干擾。

研究下源碼。

Thread線程對象里面維護了一個ThreadLocalMap對象,上面示例中設置的值都是存在對應線程的ThreadLocalMap對象中,ThreadLocalMap用于存儲其對應線程的數據:

看下如何創建ThreadLocalMap:

可以看出,ThreadLocalMap中有個table數組,用于存儲Entry(鍵:ThreadLocal對象,值為需要保存的對象)。 table數組初始長度只有16, 根據threadLocalHashCode & 15得到索引,該索引范圍0 - 15。?

后續table數組容量不夠了會擴容該數組:

再看下Entry類:

繼承了弱引用,當ThreadLocal對象沒有強引用時可以被GC回收。

ThreadLocal核心方法:

1、set, 將需要保存的值保存到當前線程的ThreadLocalMap對象中。上面分析過,是通過鍵值對的方式保存,key為該ThreadLocal對象,value為要保存的對象。

2、get, 從當前線程的ThreadLocalMap中取出該ThreadLocal存的對象。

3、remove, 當存儲數據不再使用時,記得調用remove方法移除數據,防止內存泄漏:

ok. 總結,通過ThreadLocal存儲數據是存到調用線程中,不同線程存儲的數據是互相獨立的。可用于實現線程局部變量。

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

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

相關文章

后端Web實戰(項目管理)

Restful風格 我們的案例是基于當前最為主流的前后端分離模式進行開發 在前后端分離的開發模式中&#xff0c;前后端開發人員都需要根據提前定義好的接口文檔&#xff0c;來進行前后端功能的開發。 后端開發人員&#xff1a;必須嚴格遵守提供的接口文檔進行后端功能開發&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路 這一題思路上就是一個廣度優先遍歷&#xff0c;我們不斷考察當前時間點以及位置…

OpenXR Runtime切換工具-OpenXR-Runtime-Switcher

在開發VR時&#xff0c;有時有多個設備&#xff0c;大家可能也會選擇不同的串流工具&#xff0c;OpenXR類似于默認瀏覽器&#xff0c;如果設置錯誤可能導致游戲無法串流。 推薦一個工具&#xff0c;可以設置默認的OpenXR工具。 OpenXR-Runtime-Switcher 對于沒有的設備&#…

Opencv探索之旅:從像素變化到世界輪廓的奧秘

在你已經能熟練地為圖像施展“降噪”、“縮放”等魔法之后&#xff0c;你的探索之旅來到了一個全新的領域。你可能會好奇&#xff1a;我們人類能輕易地識別出照片中杯子的邊緣、建筑的輪廓&#xff0c;那計算機是如何“看見”這些邊界的呢&#xff1f;僅僅依靠濾波和顏色變換&a…

Ubuntu 22.04 + MySQL 8 無密碼登錄問題與 root 密碼重置指南

背景場景 在 Ubuntu 系統中使用 apt 或 deb 包方式安裝 MySQL 8 時&#xff1a; 初次安裝后會自動初始化數據庫&#xff1b;但 沒有提示 root 初始密碼&#xff1b;導致 mysql -u root -p 無法登錄。 為了解決該問題&#xff0c;通常我們使用 --skip-grant-tables 方式跳過權限…

題解:P13017 [GESP202506 七級] 線圖

首先明白定義&#xff1a; 線圖 L(G)L(G)L(G) 的頂點對應原圖 GGG 的邊&#xff0c;當且僅當原圖中的兩條邊有公共頂點時&#xff0c;對應的線圖頂點之間有一條邊。 不難想到&#xff0c;對于原圖中的每個頂點 vvv&#xff0c;其度數 d(v)d(v)d(v) 對應的邊集可以形成 (d(v)2)\…

c++ duiLib環境集成2

繼續上一篇&#xff0c;現在需要把控制臺隱藏&#xff0c;只顯示調用duiLib框架顯示的窗口。右鍵項目 → 屬性 → 鏈接器 → 系統 → ?子系統?改為 窗口(/SUBSYSTEM:WINDOWS)。原來是這樣&#xff1a;修改為&#xff1a;運行報錯&#xff1a;需要修改入口函數為WinMain。如下…

常見的網絡攻擊方式及防御措施

常見的網絡攻擊方式及防御措施&#xff1a;全面解析網絡安全威脅 前言肝文不易&#xff0c;點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速發展的今天&#xff0c;網絡安全威脅無處不在&#…

JavaScript 中導入模塊時,確實不需要顯式地寫 node_modules 路徑。

1. 正確的導入語法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目錄是默認的模塊搜索路徑&#xff0c;因此直接寫包名即可&#xff1a;// ? 正確&#xff1a;直接使用包名import nprogress/nprogress.css;// ? 錯誤&#xff1a;不需要顯式寫 node_modules 路徑im…

ELK Stack技術棧

文章目錄一、日志收集所解決的問題二、Elastic Stack 組件介紹2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安裝3.1 安裝JAVA環境&#xff08;所有ES節點&#xff09;3.2 安裝ES集群3.2.1 ES單節點部署3.2.2 ES JAVA調優&#xff1a;堆(heap)內…

大騰智能國產 3D CAD:設計自由度拉滿,數據安全鎖死

在智能制造與數字化轉型的浪潮中&#xff0c;大騰智能CAD作為一款自主研發的三維計算機輔助設計軟件&#xff0c;憑借其從概念設計到制造落地的全流程覆蓋能力&#xff0c;正成為國產工業設計軟件領域的新銳力量。軟件深度融合先進建模技術與工程實踐需求&#xff0c;為機械制造…

ubuntu 操作記錄

1&#xff1a;安裝minicom 1: sudo apt-get install minicom minicom -s 2&#xff1a;Ctrl Z C 的區別 ctrlz的是將任務中斷,但是此任務并沒有結束,他仍然在進程中他只是維持掛起的狀態,用戶可以使用fg/bg操作繼續前臺或后臺的任務,fg命令重新啟動前臺被中斷的任務,bg命令…

深度剖析:向70歲老系統植入通信芯片——MCP注入構建未來級分布式通信

> 如何讓老舊系統重獲新生?協議注入技術是關鍵。 ## 一、當遺留系統遇上分布式未來:一場艱難的對話 想象一下:你負責維護一套誕生于20年前的單體式銀行核心系統,它像一位固執的70歲老人,使用著陳舊的TCP自定義協議。這時業務部門要求實現與云原生風險分析引擎的實時…

針對 SSD 固態硬盤的安全擦除 Secure Erase

SSD 的安全擦除&#xff08;Secure Erase&#xff09;用于永久刪除存儲介質上的數據&#xff0c;以及在驅動器性能開始明顯下降至低于標稱值時恢復其速度。Secure Erase 可以解決的問題核心當 SSD 開始運行緩慢&#xff08;讀寫數據變差&#xff09;時&#xff0c;這里有許多可…

Three.js搭建小米SU7三維汽車實戰(3)軌道控制器

往期內容&#xff1a; Three.js搭建小米SU7三維汽車實戰&#xff08;1&#xff09;搭建開發環境 Three.js搭建小米SU7三維汽車實戰&#xff08;2&#xff09;場景搭建 軌道控制器 軌道控制器可以改變相機在空間坐標系中的位置 進而方便從不同的角度觀察物體 1. 軌道控制器響…

C++樹狀數組詳解

C樹狀數組深度解析 第1章 引言&#xff1a;為什么需要樹狀數組 1.1 動態序列處理的挑戰 在現代計算機科學中&#xff0c;我們經常需要處理動態變化的序列數據&#xff0c;這類數據具有以下特點&#xff1a; 實時更新&#xff1a;數據點會隨時間不斷變化頻繁查詢&#xff1a;需要…

TeamT5-ThreatSonar 解決方案:構建智能動態的 APT 與勒索軟件防御體系

一、核心功能深度解析&#xff1a;從威脅狩獵到自動化響應的閉環能力 &#xff08;一&#xff09;威脅狩獵&#xff1a;主動挖掘潛伏性攻擊的 “數字偵探” 多層級威脅識別引擎&#xff1a; 靜態特征匹配&#xff1a;內置超 1000 種 APT 后門簽名&#xff08;如 Regin、Duqu 等…

C#基礎篇(10)集合類之列表

C# 中的列表(List)詳解列表(List)概述在C#中&#xff0c;List<T>是System.Collections.Generic命名空間中的一個泛型集合類&#xff0c;它提供了動態大小的數組功能&#xff0c;可以存儲指定類型的元素。列表的創建與初始化// 創建一個空列表 List<int> numbers n…

SpringBoot訂單模塊核心接口設計與實現

目錄 一、 管理端接口實現 (后臺管理系統) 一、訂單搜索 (高權重 - 核心管理功能) 1.Controller (OrderController): 2.Service (OrderService): 3.ServiceImpl (OrderServiceImpl): 1.使用MyBatis分頁插件PageHelper 2.基礎數據查詢 4.Mapper (OrderMapper): 5.Mapper …

EXCEL鏈接模板無法自動鏈接到PowerBI?試試這個方法

在使用EXCEL鏈接模板連接PowerBI時&#xff0c;你有沒有遇到如圖所示的提示呢&#xff1a;下面我來分享一下&#xff0c;出現彈框的原因及解決方法&#xff1a;首先我們先看一下這個英文翻譯&#xff0c;意思就是說&#xff0c;我們只能使一個PowerBI文件處于打開的狀態&#x…