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