必知必会--ConcurrentHashMap锁分段原理

本文探讨了HashMap在线程不安全的情况以及Hashtable的低效率问题,推荐使用ConcurrentHashMap。ConcurrentHashMap通过锁分段技术实现高并发安全性,每个锁仅锁定部分数据,允许不同线程并行操作不同数据段。文章通过举例说明锁分段的工作原理,并简述其内部结构和put()方法中锁分段的实现方式。
摘要由CSDN通过智能技术生成

前言

HashMap是线程不安全的类,JDK1.8之前多线程的情况下,如果多次put操作会导致死循环,尽管JDK1.8对HashMap进行了优化,但是HashMap并不是为了线程安全而设计的类。因此多线程下我们应该尽量避免使用HashMap。

尽管Hashtable是线程安全的类,但是当Hashtable进行put操作时会将整个Hashtable对象锁起来,同一时刻只允许一个线程向Hashtable中put数据,多线程情况下使用Hashtable效率极低。

如果追求效率与线程安全,此时可以使用ConcurrentHashMap。ConcurrentHashMap是一个利用锁分段的技术的线程安全容器类,允许多个线程对ConcurrentHashMap同时进行写操作。ConcurrentHashMap之所以允许多个线程同时进行写操作,核心在于利用了锁分段的思想。

ps:代码来源于JDK1.8

正文

ConcurrentHashMap容器中拥有多个锁,每一把锁锁住部分数据,因此在多线程情况下,不同线程操作不同数据不会造成冲突,线程之间也不会存在锁竞争,有效的提高了并发访问效率。ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。ConcurrentHashMap的结构使用的是数组+链表+红黑树。如果ConcurrentHashMap数组的长度是n,那么总共就会有n段数据,ConcurrentHashMap最多可以同时支持n个线程对容器进行操作。

对于ConcurrentHashMap的锁分段机制,举这样一个例子来帮助理解。假设现在有20个人,地面上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值