分段锁学习记录
分段锁概述
分段锁是一种通过缩小锁粒度来提高并发性能的锁设计策略,核心思想是将共享数据分割成多个独立的 “段(Segment)”,每个段单独配备一把锁。当线程操作某一段数据时,只需获取该段的锁,不会影响其他段的访问,从而允许多个线程同时操作不同的段,大幅降低锁竞争。
经典应用
ConcurrentHashMap
JDK7 及之前版本的 ConcurrentHashMap,之后版本已废除,采用红黑树+synchronized
设计结构:JDK7 的 ConcurrentHashMap 由 多个 Segment 组成,每个 Segment 本质上是一个 “小 HashMap”(内部包含数组和链表),且每个 Segment 都继承了 ReentrantLock(可重入锁),因此每个 Segment 自身就是一把独立的锁。
关于 ReentrantLock 请查阅我关于锁的详细介绍的相关文档,这里就不多解释了
核心操作:
当往 ConcurrentHashMap 中插入数据时,步骤如下:
- 根据 key 的哈希值计算出对应的 Segment 索引(确定要操作的段);
- 获取该 Segment 的锁(若其他线程正在操作此段,当前线程会阻塞等待锁释放);
- 在当前 Segment 内部执行具体的插入逻辑(和普通 HashMap 类似,如计算数组索引、处理哈希冲突等);
- 操作完成后,释放该 Segment 的锁。
关于 hashmap 的详细介绍,请查阅我在算法基础课第二章哈希表的内容
优缺点
优点:
- 高并发性能:相比 “全局锁”(如 Hashtable 用 synchronized 修饰方法,全表一把锁),分段锁将锁粒度从 “整个容器” 缩小到 “单个段”,大幅减少锁竞争,支持多线程并行操作不同段,吞吐量更高。
- 读写分离友好:读操作(如 get)无需加锁(依赖 volatile 保证可见性),仅写操作加锁,进一步提升读性能。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Myskill-blog!
