【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.mzph.cn/bicheng/17080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【物联网实战项目】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 …

嵌入式学习记录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风格字符串…

Java面试八股之线程池是怎么实现的

线程池是怎么实现的 线程池是一种基于池化技术的线程管理方式&#xff0c;通过预先创建一定数量的线程并保持在池中待命&#xff0c;从而在有任务来临时能够快速分配线程处理任务&#xff0c;而无需频繁创建和销毁线程&#xff0c;以此达到提升系统性能、减少资源消耗的目的。…

推荐《从零开始大模型开发与微调》

大模型是深度学习是当前AI和NLP研究与产业中最重要的方向之一。 本书用PyTorch 2.0作为学习大模型的基本框架&#xff0c;以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术&#xff0c;为读者揭示大模型开发技术。 《从零开始大模型开发与微调&…

Windows10映射网络驱动器之后不显示映射盘

目录 背景解决步骤1、按 Windows R 打开运行2、打开注册表编辑器3、 System上新建-- DWORD(32bit)4、对新建的文件重命名5、将EnableLinkedConnections的数值改为16、退出注册表编辑器&#xff0c;重启系统。 知识扩展断开连接备份注册表 背景 目前有一台NAS服务器,和一台lin…

工厂模式的三种实现方式

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

关于0成本部署个人博客

分享一个文章关于零成本搭建个人博客 参考&#xff1a;‘关于部署博客hexoshokagithub的流程以及问题’ - 关于博客部署 | XiaoYang Guo Welcome to Guo Xiaoyangs personal blog 欢迎来到郭晓阳的个人博客 (1330303.github.io) 这个博主讲的流程很全&#xff0c;而且回答也…

智慧管廊巡检运维解决方案

一、智慧管廊巡检行业目前存在的挑战和难题 智慧管廊巡检行业面临着运行环境的客观影响&#xff0c;如地面施工、液体渗漏、通风不佳、内部空间受限等问题。而管廊巡检机器人系统的出现却具有重大意义。它能够有力地保障管廊安全且可靠地运行&#xff0c;在面对火情、灾情等紧…

springboot基础篇(快速入门+要点总结)

目录 一、SpringBoot简介 二、创建SpringBoot&#xff08;通过Idea脚手架搭建项目&#xff09; 三、properties配置文件 properties 配置文件说明 ①. properties 基本语法 ②. 读取配置⽂件 ③. properties 缺点 2. yml 配置⽂件说明 ①. yml 基本语法 ②. yml 使用进…

上海AI lab发布MathBench,GPT-4o的数学能力有多强?

大模型数学能力哪家强&#xff1f; 最近&#xff0c;上海AI lab构建了一个全面的多语言数学基准——MathBench。与现有的基准不同的是&#xff0c;MathBench涵盖从小学、初中、高中、大学不同难度&#xff0c;从基础算术题到高阶微积分、统计学、概率论等丰富类别的数学题目&a…

【Linux】升级make(版本4.4.1)、升级gdb(版本14.1)、升级autoconf(版本2.71)

centos7升级make&#xff08;版本4.4.1&#xff09;&#xff1a; make&#xff1a;编译和构建工具。Linux中很多软件包需要make编译构建。官网&#xff1a;Make - GNU Project - Free Software Foundation 本次升级前的make版本是3.82&#xff0c;准备安装的版本是4.4.1。make…

【Delphi 开箱即用 4】动态切换主题皮肤(明亮 or 暗黑)

Delphi的原始窗口界面看起来并不够吸引人。尝试下载并安装第三方皮肤可能会导致应用程序尺寸急剧增加&#xff0c;并且可能会出现不稳定的情况。事实上&#xff0c;Delphi自带了皮肤功能&#xff0c;完全可以满足我们对窗口界面的美化需求&#xff0c;并且还支持动态切换皮肤。…

Python I/O操作笔记

打开文件&#xff1a; 使用 open() 函数&#xff0c;其中文件路径可以是相对路径或绝对路径。 模式除了常见的 r&#xff08;只读&#xff09;、w&#xff08;写入&#xff0c;会覆盖原有内容&#xff09;、a&#xff08;追加&#xff09;外&#xff0c;还有一些其他组合模式&…