【Java】IdentityHashMap 的使用場景

文章目錄

    • 前言
    • 1. Druid 應用場景
    • 2. IdentityHashMap 特性
    • 3. IdentityHashMap 同步化
    • 4. IdentityHashMap 處理key為空值
    • 后記

前言

最近有興趣看一下 Druid 連接池怎么做連接管理的,看到一個類 IdentityHashMap ,這里記錄一下使用場景。

1. Druid 應用場景

  • 定義
protected final Map<DruidPooledConnection, Object> activeConnections 
= new IdentityHashMap<DruidPooledConnection, Object>();
  • 最外層調用
	if (url.startsWith("/activeConnectionStackTrace-") && url.endsWith(".json")) {Integer id = StringUtils.subStringToInteger(url, "activeConnectionStackTrace-", ".");// 內部從IdentityHashMap的容器中取值return returnJSONActiveConnectionStackTrace(id);}
  • 用法概括
    Druid 的特點就是做監控,每一個連接,也就是 DruidPooledConnection 都對應一個調用棧的詳情。
    這些連接的調用棧信息保存到 IdentityHashMap<DruidPooledConnection, Object>
    中,對外提供查詢服務。

2. IdentityHashMap 特性

觀察一下 IdentityHashMap 的 key的hash值,來自于該對象的應用地址。
在這里插入圖片描述
言下之意是:IdentityHashMap 的 key ,無論屬性如何改變都不影響容器的尋址
Druid 就是用這個特性保留連接的堆棧記錄

3. IdentityHashMap 同步化

Collections.synchronizedMap(new IdentityHashMap<Object, ObjectName>());
  • Druid 內部線程安全的用法
    在這里插入圖片描述
  • 外層使用
    在這里插入圖片描述
    前文一直疑惑為什么把value泛型指定為 Object,這里倒是看懂了,這個容器有很多統計類型數據。感慨一下這個泛化的map也太多地方用了吧,業務代碼這么寫會被吐槽吧。

4. IdentityHashMap 處理key為空值

類比一下 HashMap,可以存儲 null 的 key,是把 null 映射為 0
在這里插入圖片描述

而 IdentityHashMap 將 null 映射為空對象
在這里插入圖片描述在這里插入圖片描述

后記

如果有池化管理對象的需求(比如連接池),且考慮將對象作為某個容器的key,此時可以考慮使用 IdentityHashMap

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

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

相關文章

代碼隨想錄算法訓練營第36期DAY41

DAY41 動態規劃理論基礎 還差閆氏分析法沒學完。見B站收藏夾。 前兩題學習初始化方式就好vector<int> dp(N1); 509斐波那契數 簡單。 class Solution {public: int fib(int N) { if (N < 1) return N; int dp[2]; dp[0] 0; dp[…

plt畫圖中文亂碼

1、使用font_manager的FontProperties解決 通過FontProperties來設置字符及大小&#xff0c;來解決中文顯示的問題&#xff0c;代碼如下&#xff1a; import matplotlib import matplotlib.pyplot as pltpath "..\simsun.ttc"#改成你自己的文件路徑 font FontProp…

【物聯網實戰項目】STM32C8T6+esp8266/mqtt+dht11+onenet+uniapp

一、實物圖 前端uniapp效果圖&#xff08;實現與onenet同步更新數據&#xff09; 首先要確定接線圖和接線順序&#xff1a; 1、stm32c8t6開發板連接stlinkv2下載線 ST-LINK V2STM323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND 2、ch340串口連接底座&#xff08;注意RXD和TXD的連接方式…

NSS題目練習4

[LitCTF 2023]1zjs 打開后是一個游戲&#xff0c;用dirsearch掃描&#xff0c;什么都沒發現 查看源代碼搜索flag&#xff0c;發現沒有什么用 搜索php&#xff0c;訪問 出現一堆符號&#xff0c;看樣子像是jother編碼 解碼得到flag&#xff0c;要刪掉[] [LitCTF 2023]Http pro …

37、Flink 的窗口函數(Window Functions)詳解

窗口函數&#xff08;Window Functions&#xff09; a&#xff09;概述 定義了 window assigner 之后&#xff0c;需要指定當窗口觸發之后&#xff0c;如何計算每個窗口中的數據&#xff0c; 即 window function。 窗口函數有三種&#xff1a;ReduceFunction、AggregateFunc…

嵌入式學習記錄5.27(c++基礎1)

目錄 一.C和C的區別 二.輸入輸出流類 2.1輸出cout 2.2輸入cin 三.命名空間 2.1使用命名空間中的標識符 2.2命名空間中聲明函數 2.3命名沖突問題 2.4匿名空間 2.5命名空間添加&#xff0c;嵌套&#xff0c;重命名 四.字符串的使用 4.1string類 4.2C風格和C風格字符串…

LeetCode27.移除元素

題目鏈接&#xff1a; 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a;同樣屬于經典的雙指針移動問題&#xff0c;要掌握固定的思路即可。 算法分析&#xff1a;這個題目可以這樣處理&#xff0c;我們把所有非val 的元素都向前移動&#xff0c;把…

Java面試八股之線程池是怎么實現的

線程池是怎么實現的 線程池是一種基于池化技術的線程管理方式&#xff0c;通過預先創建一定數量的線程并保持在池中待命&#xff0c;從而在有任務來臨時能夠快速分配線程處理任務&#xff0c;而無需頻繁創建和銷毀線程&#xff0c;以此達到提升系統性能、減少資源消耗的目的。…

推薦《從零開始大模型開發與微調》

大模型是深度學習是當前AI和NLP研究與產業中最重要的方向之一。 本書用PyTorch 2.0作為學習大模型的基本框架&#xff0c;以ChatGLM為例詳細講解大模型的基本理論、算法、程序實現、應用實戰以及微調技術&#xff0c;為讀者揭示大模型開發技術。 《從零開始大模型開發與微調&…

兩個數組的交集-力扣

想到的解法是使用兩個哈希表&#xff0c;s1用來統計nums1中出現過的數字&#xff0c;然后遍歷nums2數組&#xff0c;當能夠在s1中查找到nums2的元素時&#xff0c;將這個元素添加到s2中&#xff0c;最后遍歷s2&#xff0c;將其中的元素添加到返回數組中。 但最開始寫時&#xf…

外星人存在與否......----小話外星人(1)

前一段時間&#xff0c;看了好多關于UFO、外星人、宇宙、遠古外星人的視頻和電子書&#xff0c;最后發現&#xff0c;這樣的東西還是不要看多為好&#xff0c;搞得好像這些是真的似的&#xff0c;有時睡覺會被意外驚醒&#xff0c;想多了...... 1、外星人存在嗎 不管有多少UFO的…

Windows10映射網絡驅動器之后不顯示映射盤

目錄 背景解決步驟1、按 Windows R 打開運行2、打開注冊表編輯器3、 System上新建-- DWORD(32bit)4、對新建的文件重命名5、將EnableLinkedConnections的數值改為16、退出注冊表編輯器&#xff0c;重啟系統。 知識擴展斷開連接備份注冊表 背景 目前有一臺NAS服務器,和一臺lin…

Vuex 頁面刷新數據丟失怎么解決

當Vuex中的數據在頁面刷新后丟失時&#xff0c;這通常是因為Vuex的狀態數據是保存在運行內存中的&#xff0c;頁面刷新會導致Vue實例重新加載&#xff0c;進而Vuex中的數據被重置為初始狀態。為了解決這個問題&#xff0c;可以采取以下幾種方法&#xff1a; 1. 使用瀏覽器的本…

工廠模式的三種實現方式

文章目錄 1.引出工廠模式具體需求 2.傳統模式1.類圖2.目錄結構3.pizzastore 用于設計pizza1.Pizza.java 抽象的Pizza類型2.CheesePizaa.java CheesePizaa3.GreekPizza.java GreekPizza 4.order 用于訂購和制作pizza1.OrderPizza.java 制作pizza2.PizzaStore.java 訂購pizza 5.優…

【Redis】 關于列表類型

文章目錄 &#x1f343;前言&#x1f340;常見操作命令介紹&#x1f6a9;lpush&#x1f6a9;lpushx&#x1f6a9;rpush&#x1f6a9;rpushx&#x1f6a9;lrange&#x1f6a9;lpop&#x1f6a9;rpop&#x1f6a9;lindex&#x1f6a9;linsert&#x1f6a9;llen&#x1f6a9;lrem&…

“按摩”科技?

都說A股股民是特別善于學習的&#xff0c;這不市場又現新概念——“按摩科技”&#xff0c;成立僅6年&#xff0c;把上門按摩干到35億營收也是沒誰了&#xff0c;現在號稱有1000萬用戶&#xff0c;3萬家入駐商戶數的按摩平臺&#xff0c;難道就憑借2.5萬名女技師&#xff0c;活…

【Django】中間件實現鉤子函數預處理和后處理,局部裝飾視圖函數

在app文件夾里新建middleware.py繼承MiddlewareMixin&#xff0c; 編寫中間件類&#xff0c;重寫process_request、process_response鉤子函數 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

關于pytest中用例名稱使用中文亂碼的解決

場景&#xff1a;使用pytest.mark.parametrize裝飾器為用例自定義名稱時&#xff0c;運行顯示亂碼。如下圖所示&#xff1a; 解決方案&#xff1a; 1.在根目錄 pytest.ini中增加一行代碼 [pytest] disable_test_id_escaping_and_forfeit_all_rights_to_community_supportTrue…

NAT 網絡轉換

NAT(Network Address Translation) 網絡地址轉換 0x01 NAT 簡介 為什么要使用 NAT IPv4 網絡地址緊缺&#xff0c;從而出現了私有網段&#xff0c;來補充地址&#xff0c;但私有網段不課訪問 internet 所以出現了 NAT 地址轉換&#xff0c;將私有地址&#xff0c;轉換為公網 I…

一口氣看完es(上)

此系列博客分為上中下3篇&#xff1a;上篇是關于es的概念和對數據的增刪改操作&#xff0c;中篇是對數據的查詢、對搜索結果進行處理操作&#xff0c;下篇是介紹怎么在Java代碼中調用和操作es。 基本概念 1、es是什么&#xff1f;有什么作用&#xff1f; es全名是elasticsea…