文章目錄
- 前言
- 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