暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

理解ConcurrentHashMap的分段锁

这个码农有点帅 2021-06-21
706

分段锁其实是一种锁的设计,并不是具体的一种锁。下面我们一起来聊聊分段锁能为高并发环境下带来的好处。

    如上图,以ConcurrentHashMap来说一下分段锁的含义以及设计思想,ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。

    当需要put元素的时候,并不是对整个HashMap进行加锁,而是先通过hashcode来知道它要放在那一个分段中,然后对这个分段进行加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了真正的并行的插入。

    但是,在统计size的时候,可就是获取hashmap全局信息的时候,就需要获取所有的分段锁才能统计。

    分段锁的设计目的是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数组中的一项进行加锁操作。


扩展内容:

java.util.concurrent提供了工具类:

当期望许多线程访问一个给定collection 时,使用ConcurrentHashMap替代HashMap;

当期望许多线程访问一个给定collection 时,使用ConcurrentSkipListMap替代TreeMap;

ConcurrentSkipListSet提供的功能类似于TreeSet,能够并发的访问有序的set。因为ConcurrentSkipListSet是基于“跳跃列表”实现的,只要多个线程没有同时修改集合的同一个部分,那么在正常读、写集合的操作中不会出现竞争现象;

当期望的读数和遍历远远大于列表的更新数时,使用CopyOnWriteArrayList 替代ArrayList。

当期望的读数和遍历远远大于列表的更新数时,使用CopyOnWriteArraySet替代HashSet。


文章转载自这个码农有点帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论