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🥝

化整为零

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

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

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

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

(在扩容期间)

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

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

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


🔎结尾

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

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

相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
19222 2
|
消息中间件 存储 RocketMQ
Rocketmq如何保证消息不丢失
文章分析了RocketMQ如何通过生产者端的同步发送与重试机制、Broker端的持久化存储与消息重试投递策略、以及消费者端的手动提交ack与幂等性处理,来确保消息在整个传输和消费过程中的不丢失。
|
6月前
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
5月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1493 7
|
存储 安全 Java
Hashtable 和 HashMap 的区别
【8月更文挑战第22天】
1028 0
|
5月前
|
人工智能 Java 数据库
如何保证接口幂等性?
在分布式系统中,接口幂等性至关重要。本文详解其定义、重要性及实现方案,包括唯一索引、Token机制、分布式锁、状态机与版本号机制,并提供最佳实践建议,助你提升系统可靠性与用户体验。
780 1
|
7月前
|
存储 人工智能 安全
一文了解:阿里云对象存储OSS是什么?
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,数据持久性达99.9999999999%,适用于互联网音视频、教育、AI/物联网、影视渲染及基因等行业。OSS提供标准、低频、归档等多种存储类型,支持按量付费与资源包两种计费模式,公网出流量收费,内网流量免费。
10268 7
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
1824 25
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
25310 7
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
XML Java 数据格式
【springboot原理篇】Bean的加载方式,面试必看
【springboot原理篇】Bean的加载方式,面试必看
692 0