Java高頻面試之并發編程-10

hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶

面試官:ThreadLocalMap 怎么解決 Hash 沖突的?

ThreadLocalMap 是 ThreadLocal 的核心實現,它采用 開放地址法(Open Addressing)中的線性探測(Linear Probing) 來解決哈希沖突。與 HashMap 的拉鏈法(鏈式地址法)不同,ThreadLocalMap 直接在數組上順序查找下一個可用槽位。以下是其詳細實現機制:


1. 哈希沖突解決原理

(1) 數據結構
  • 底層數組Entry[] table,每個 EntryThreadLocal<?> 為鍵(弱引用),存儲線程本地變量的值。
  • 初始容量:默認 16,擴容閾值為數組長度的 2/3。
(2) 哈希函數
  • 哈希計算
    ThreadLocal 實例的 threadLocalHashCode 通過原子遞增生成,確保哈希分布均勻。
    private final int threadLocalHashCode = nextHashCode();
    private static AtomicInteger nextHashCode = new AtomicInteger();
    private static final int HASH_INCREMENT = 0x61c88647; // 黃金分割數
    private static int nextHashCode() {return nextHashCode.getAndAdd(HASH_INCREMENT);
    }
    
  • 索引計算
    通過 hashCode & (table.length - 1) 確定初始槽位(類似 HashMap 的取模優化)。
(3) 線性探測流程

當插入或查找鍵值對時,若目標槽位已被占用(鍵不同或哈希沖突),則按順序向后查找空槽位(到數組末尾后折返到頭部)。

操作步驟

  1. 計算初始索引i = key.threadLocalHashCode & (len - 1)
  2. 遍歷數組
    • Entry[i] 的鍵匹配 → 直接操作該槽位。
    • Entry[i] 的鍵為 null(弱引用被回收)→ 觸發清理(expungeStaleEntry)。
    • Entry[i] 被占用但鍵不匹配 → i = nextIndex(i, len)(即 i+1,超過長度則回繞到 0)。
  3. 找到空槽或完成清理:插入新鍵值對或更新現有值。

2. 關鍵代碼解析(以 set() 方法為例)

private void set(ThreadLocal<?> key, Object value) {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)]) {ThreadLocal<?> k = e.get();if (k == key) { // 鍵匹配,直接更新值e.value = value;return;}if (k == null) { // 遇到過期 Entry(鍵被回收),替換過期槽位replaceStaleEntry(key, value, i);return;}}// 找到空槽位,插入新 Entrytab[i] = new Entry(key, value);int sz = ++size;// 清理部分過期 Entry 后若仍超過閾值,觸發擴容if (!cleanSomeSlots(i, sz) && sz >= threshold)rehash();
}

3. 線性探測的優缺點

優點缺點
節省內存:無鏈表指針開銷沖突較多時查找效率下降(最差 O(n))
適合小規模數據(ThreadLocalMap 通常條目少)擴容成本高(需全量 rehash)
內存局部性好(數組連續遍歷)需要處理過期 Entry 清理邏輯

4. 清理過期 Entry(解決內存泄漏)

在線性探測過程中,若遇到鍵為 null 的過期 Entry,會觸發清理:

  1. expungeStaleEntry(int staleSlot)
    • 清理當前過期槽位,并向后探測,重新哈希未過期的 Entry,直到遇到空槽。
    • 解決因哈希沖突導致過期 Entry 殘留的問題。
  2. cleanSomeSlots()
    • 啟發式清理,掃描 log(n) 次,平衡清理開銷與內存釋放。

5. 示例場景

假設 ThreadLocalMap 的數組長度為 8,插入兩個鍵 AB,其哈希計算后的初始索引均為 3:

  1. 插入鍵 A:直接放入索引 3。
  2. 插入鍵 B
    • 索引 3 已被 A 占用,向后探測到索引 4,放入 B
  3. 查找鍵 B
    • 計算初始索引 3,發現是 A → 繼續探測索引 4,找到 B

6. 對比 HashMap 的拉鏈法

特性ThreadLocalMap(開放地址法)HashMap(拉鏈法)
沖突解決線性探測,順序查找空槽鏈表或紅黑樹鏈接沖突節點
內存占用更緊湊(無鏈表指針)需要額外指針存儲鏈表/樹結構
適用場景預期條目少,內存敏感高并發、大數據量
擴容機制全量 rehash,成本高鏈表拆分,增量遷移

總結

  • 核心機制:ThreadLocalMap 通過線性探測解決哈希沖突,犧牲一定查找效率換取內存緊湊性。
  • 內存安全:結合弱引用鍵和主動清理過期 Entry,減少內存泄漏風險。
  • 適用場景:適合線程本地變量數量少、生命周期與線程綁定的場景。

在這里插入圖片描述

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

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

相關文章

AI應用實戰:Excel表的操作工具

有個小需求是這樣的&#xff0c;需要在一份數據表里&#xff0c;將1000多個客戶的月報數據分別單獨截圖存檔&#xff0c;有客戶需要的時候就要發給客戶&#xff0c;截圖下來的也是以客戶為命名&#xff0c;這樣查找時也比較容易匹配上。 在沒有寫工具之前&#xff0c;以往財務…

使用 DoH 查詢域名 —— 以 core.tantanapp.com 為例的實戰分析

前言 在現代 iOS 應用中&#xff0c;為了確保 DNS 查詢的隱私和完整性&#xff0c;我們可以使用 DoH&#xff08;DNS over HTTPS&#xff09; 來查詢域名信息。 本文將以 https://cloudflare-dns.com/dns-query?namecore.tantanapp.com&typeA 為例&#xff0c;通過 Postm…

Python----卷積神經網絡(卷積為什么能識別圖像)

一、卷積的概念 卷積是一種數學運算&#xff0c;通常用于信號處理和圖像分析。在卷積神經網絡中&#xff0c;卷積操作用于提取輸入數據&#xff08;如圖像&#xff09;中的特征。通過將輸入數據與卷積核&#xff08;濾波器&#xff09;進行卷積運算&#xff0c;CNN能夠識別圖像…

linux FTP服務器搭建

FTP服務器搭建 系統環境&#xff1a;ubuntu 搭建方式&#xff1a;win系統下通過ssh連接ubuntu&#xff0c;搭建FTP服務 一、ssh連接 ssh -p 端口 用戶名IP ssh -p 22 ubuntu192.168.1.109 密碼&#xff1a;ubuntu123456 二、安裝配置FTP服務器 1、安裝 sudo apt install v…

語音合成之十韻律之美:TTS如何模擬語音的節奏和語調

韻律之美&#xff1a;TTS如何模擬語音的節奏和語調 1. 引言&#xff1a;韻律在語音合成中的重要性1.1 追求自然的TTS&#xff1a;超越可懂度1.2 定義韻律&#xff1a;語音的音樂1.3 韻律為何重要&#xff1a;傳遞意義、情感與自然度 2. TTS韻律建模的基礎技術2.1 利用文本&…

基于強化學習的用于非剛性圖像配準的引導式超聲采集|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Guided ultrasound acquisition for nonrigid image registration usingreinforcement learning 基于強化學習的用于非剛性圖像配準的引導式超聲采集 01 文獻速遞介紹 超聲成像通常用于引導手術和其他醫療程序&#xff0c;在這些過程中&#xff0c;臨床醫生會持…

數據庫中DDL、DML、DCL的區別是什么?

數據庫中DDL、DML、DCL的區別是什么&#xff1f; 在數據庫的使用過程中&#xff0c;SQL&#xff08;結構化查詢語言&#xff09;常常被用來執行不同的操作&#xff0c;主要分為三類&#xff1a;DDL&#xff08;數據定義語言&#xff09;、DML&#xff08;數據操縱語言&#xf…

海量聊天消息處理:ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成

海量聊天消息處理&#xff1a;ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成 一、背景介紹 每天有2000萬條聊天消息&#xff0c;一年下來幾千萬億海量數據。為應對這種規模的數據存儲和處理需求&#xff0c;本文將從以下幾…

Vim 中替換字符或文本

在 Vim 中替換字符或文本可以使用 替換命令&#xff08;substitute&#xff09;&#xff0c;其基本語法為&#xff1a; :[range]s/old/new/[flags]1. 基本替換 命令說明:s/foo/bar/替換當前行的第一個 foo 為 bar:s/foo/bar/g替換當前行的 所有 foo 為 bar:%s/foo/bar/g替換 …

當傳統美術館遇上數字革命:觀眾體驗將迎來哪些顛覆性變革?

當數字科技與藝術創作深度交織&#xff0c;美術館與藝術機構正經歷前所未有的顛覆性浪潮。這是否宣告傳統展覽空間已正式跨入數字媒介主導的新紀元&#xff1f;投影映射與虛擬現實技術不斷突破物理限制&#xff0c;畫布與雕塑的邊界在光影與代碼中逐漸消融。這場革命不僅重構了…

內容/社區APP增長:用Deeplink讓用戶分享的內容“一鍵直達”

對于內容平臺和互動社區APP而言&#xff0c;優質內容的自發傳播是用戶增長和活躍度提升的核心驅動力之一。用戶發現一篇深度好文、一個精彩視頻或是一個引人入勝的討論帖&#xff0c;自然而然地想要分享給好友。然而&#xff0c;這個看似簡單的分享動作&#xff0c;卻往往在觸達…

Uniapp:vite.config.js全局配置

目錄 一、基本概述二、配置自動引入插件一、基本概述 vite.config.js 是一個可選的配置文件,如果項目的根目錄中存在這個文件,那么它會被自動加載,一般用于配置 vite 的編譯選項 二、配置自動引入插件 在項目命令行終端中執行如下代碼 npm install unplugin-auto-import…

JavaScript 與 Java 學習筆記

一、JavaScript 簡介 1. 定義 瀏覽器腳本語言&#xff1a;主要用于實現網頁交互功能&#xff08;鼠標點擊、鍵盤輸入響應等&#xff09; 服務器端擴展&#xff1a;通過 Node.js 運行時環境可進行后端開發 2. 核心特點 動態性&#xff1a;可實時修改 DOM 結構&#xff08;增…

Shell腳本-隨機數實戰案例

在Shell腳本編程中&#xff0c;生成隨機數是一項非常實用的技能。無論是用于模擬、測試、游戲開發還是安全相關的應用&#xff08;如生成密碼&#xff09;&#xff0c;能夠靈活地生成隨機數都是非常有用的。本文將通過幾個實際的應用案例來展示如何在Shell腳本中使用隨機數解決…

面試算法高頻08-動態規劃-03

練習題 題目描述 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每…

基于 EFISH-SBC-RK3588 的無人機多光譜/紅外熱成像邊緣計算方案

一、硬件架構設計? ?核心算力平臺&#xff08;EFISH-SBC-RK3588&#xff09;? ?處理器性能?&#xff1a;搭載 8 核 ARM 架構&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 與 Mali-G610 GPU&#xff0c;支持多光譜圖像實時融…

Python小酷庫系列:pyNest,把FastAPI程序寫出Spring的味道

pyNest&#xff0c;把FastAPI程序寫出Spring的風格 快速入門1、安裝pyNest2、創建項目3、編寫app_module.py4、編寫app_service.py5、編寫app_controller.py6、編寫main.py7、啟動程序 核心概念1、Modules2、Controllers3、Providers4、ORM Provider NestJS是風靡于Node.js圈的…

HTML 詳解:從基礎結構到語義標簽

目錄 一、HTML 是什么&#xff1f;二、HTML 的基本結構? 簡要說明&#xff1a; 三、常見 HTML 標簽講解3.1 標題標簽 <h1> ~ <h6>3.2 段落和換行3.3 超鏈接3.4 圖像插入3.5 列表無序列表&#xff1a;有序列表&#xff1a; 3.6 表格結構 四、HTML 語義化標簽詳解五…

用Python做有趣的AI項目 6:AI音樂生成器(LSTM Melody Generator)

&#x1f3b5; 項目名稱&#xff1a;AI音樂生成器&#xff08;LSTM Melody Generator&#xff09; &#x1f9e0; 項目簡介 這個項目的目標是&#xff1a;用 AI 來自動生成簡單的旋律&#xff08;MIDI格式&#xff09;&#xff0c;類似于基礎的鋼琴曲、背景音樂片段。 我們使…

【運維】利用任務計劃程序定時重啟 nssm 服務 | Windows 服務每日定時維護實踐

&#x1f680; 利用任務計劃程序定時重啟 nssm 服務 | Windows 服務每日定時維護實踐 一、前言 在 Windows 系統中&#xff0c;nssm&#xff08;Non-Sucking Service Manager&#xff09; 是一個非常好用的工具&#xff0c;可以將任意可執行程序注冊為系統服務。很多運維場景…