多线程环境下使用哈希表

本文详细介绍了HashTable和ConcurrentHashMap在多线程环境下的使用。HashTable通过全局锁保证线程安全,但效率较低。而ConcurrentHashMap则采用分段锁或CAS操作,降低锁冲突,提高并发性能。在1.8以后,ConcurrentHashMap进一步优化,读操作不加锁,但在某些场景下可能存在读一致性问题。总结指出,ConcurrentHashMap的锁分离技术使其成为高并发场景下的高效选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashTable

单纯的使用一个synchronized进行加锁~,具体相当于针对整个 HashTable对象,但是坏处就是这样的话锁冲突的概率是非常高的
在这里插入图片描述
如果有多个线程,线程1操作的在第一个链表上,线程2操作的元素在别的链表上,这个时候不涉及到线程安全。

在这里插入图片描述
此时两个线程,修改不同的变量,实际上是没有线程安全的,但是HashTable直接一把锁,锁住了,线程1去操作的时候,线程2就会被阻塞等待,这样效率就会比较低。

此外,在扩容的时候,如果某个线程T正好触发了扩容,那么这个T就倒霉了,就要负责完成整个扩容过程~

ConcurrentHashMap

内部针对多线程做出了一定的优化,并不是针对整个对象加一把锁,而是分成了很多把锁~ 降低锁冲突的概率~

注意:java1.8之后才是这样分的,而java1.7里采用分段锁,好几个链表公用一把锁。

1.每个链表 / 红黑树 分配一把锁~
只有当两个线程恰好修改的是同一个链表/红黑树的时候才会涉及到锁冲突 ~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值