Hashtable与ConcurrentHashMap的区别

简介: Hashtable与ConcurrentHashMap的区别

多线程下使用哈希表

(1)HashMap 线程不安全(不建议使用)

(2)Hashtable 线程安全(不建议使用)

(3)ConcurrentHashMap 线程安全(建议使用)

🔎Hashtable

Hashtable 只是简单的把关键方法加上了锁

如图

这相当于对Hashtable本身加锁

无论做什么都需要加锁


🔎ConcurrentHashMap

注意

ConcurrentHashMap 是JDK1.8引入的

ConcurrentHashMap 仍然是使用 synchronized 进行加锁

但不是锁住整个对象

而是用每个链表的头节点作为锁的对象

🔎区别

(1)加锁粒度不同

对于 Hashtable, 直接为整个哈希表加锁🥝

当多个线程插入多个不同的元素(多线程修改多个不同的变量)

线程1在下标1位置上插入元素

线程2在下标2位置上插入元素

这种操作不会引起线程安全问题, 但由于对整个哈希表都加了锁, 所以也会产生锁冲突

对于 ConcurrentHashMap, 将每个链表的头节点作为一把锁🥝

当多个线程插入多个不同的元素(多线程修改多个不同的变量)

线程1在下标1位置上插入元素

线程2在下标2位置上插入元素

由于将每个链表的头节点作为一把锁, 所以这种情况下不会产生锁冲突

(2)利用了CAS

对于 Hashtable🥝

size 属性通过 synchronized 操作更新(较慢)

对于 ConcurrentHashMap🥝

size 属性通过 CAS 更新(较快)

(3)扩容策略的调整

对于 Hashtable🥝

一旦触发扩容给操作, 就需要持有锁的线程完成整个扩容过程(将旧的元素搬运到新的内存空间, 搬运完毕将旧的内存空间释放), 该过程涉及到大量的元素拷贝, 效率较低

对于 ConcurrentHashMap🥝

化整为零

扩容操作不会一次性将所有元素全部搬运,而是只搬运一小部分

扩容时, 新旧空间同时存在

后续的线程也会执行上述操作, 直到将所有元素全部搬运完毕

由于每次只需要拷贝少量元素, 效率较高

(在扩容期间)

插入元素会插入在新开辟的内存空间

查找元素会同时查找新旧两块空间

删除元素会同时查找新旧两块空间,在哪块空间就删除哪块空间的元素


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
3月前
|
人工智能 Java 数据库
如何保证接口幂等性?
在分布式系统中,接口幂等性至关重要。本文详解其定义、重要性及实现方案,包括唯一索引、Token机制、分布式锁、状态机与版本号机制,并提供最佳实践建议,助你提升系统可靠性与用户体验。
437 1
|
中间件 关系型数据库 Java
MySQL数据库分库分表方案
MySQL数据库分库分表方案
534 0
MySQL数据库分库分表方案
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
23105 7
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
9月前
|
存储 安全 Java
Spring Security 入门
Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
534 2
Spring Security 入门
|
存储 负载均衡 容灾
MySQL数据库的分布式架构和数据分片方案
MySQL数据库的分布式架构和数据分片方案
|
SpringCloudAlibaba 监控 Java
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)
|
缓存 NoSQL 前端开发
《优化接口设计的思路》系列:第六篇—接口防抖(防重复提交)的一些方式
本文探讨了后端开发中的接口防抖策略,作者是一名有六年经验的Java开发者,分享了如何防止重复提交导致的问题。防抖主要用于避免用户误操作或网络波动引起的多次请求,作者提出理想防抖机制应具备正确性、响应速度、易集成和用户反馈。文章详细分析了哪些接口需要防抖(如用户输入、按钮点击、滚动加载)以及如何识别重复接口,提出了使用共享缓存和分布式锁两种实现方式,并展示了基于Redis的Java代码示例。作者通过注解实现请求锁,并提供了测试截图证明防抖效果。然而,实现完全幂等性还需要业务层面的补充措施。
947 8
|
11月前
|
数据库
什么是接口幂等性?如何保证接口幂等性?
接口幂等性(Idempotency)是指同样的请求被重复执行多次,产生的结果与执行一次的结果相同。换句话说,接口无论被调用一次还是多次,系统的最终状态保持不变。
1580 5
|
Java
Thread 类中的start() 和 run() 方法有什么区别
【8月更文挑战第9天】Thread 类中的start() 和 run() 方法有什么区别
645 0
|
缓存 安全 Java
Elasticsearch—生产环境集群核心配置
Elasticsearch—生产环境集群核心配置
216 0