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

如上图,以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。




