什么是分段锁?

1、典型回答

分段锁是一种将锁细化到每个段(Segment) 级别的锁设计。在 ConcurrentHashMap 中,它将整个数据结构分成多个段,每个段只锁定自己的一部分数据。每个段可以看作是一个独立的分组,只锁定该段(Segment)内部的数据操作,不同的段之间可以并行地进行操作。

如下图所示:

(哈希桶),相当于给多个 Entry 进行了分组操作,这样比给所有 Entry 加锁效率要高很多,currentHashMap 相比于 Hashtable 性能高的原因,Hashtable 是给所有的 Entry 加同-把锁来操作的,而 ConcurrentHashMap 将 Entry 分成了多 Segment,每个 Segment 单独加锁,这样就可以实现多个 Segment 一起并发执行了,所以 ConcurrentHashMap 的效率也会越高

2、全面剖析

分段锁是一种将锁细化到每个段(Seament)级别的锁设计。在 ConcurentHashMap 中,它将整个数据结构分成多个段,每个段只锁定自己的一部分数据

分段锁的实现源码如下:

java 复制代码
final V put(K key, int hash, V value, boolean onlyIfAbsent) {
    // 在往该 segment 写入前,先确保获取到锁
    HashEntry<K, V> node = tryLock() ? null : scanAndLockForPut(key, hash, value);
    V oldValue;
    try {
        // Segment 内部数组
        HashEntry<K, V>[] tab = table;
        int index = (tab.length - 1) & hash;
        HashEntry<K, V> first = entryAt(tab, index);
        for (HashEntry<K, V> e = first;;) {
            if (e != null) {
                K k;
                // 更新已有值...
            } else {
                // 放置 HashEntry 到特定位置,如果超过阈值则进行 rehash
                // 忽略其他代码..
            }
        }
    } finally {
        // 释放锁
        unlock();
        return oldValue;
    }
}

以上述源码我们可以看出,Segment 本身是基于 ReentrantLock 实现的加锁和释放锁的操作,这样就能保证多个线程同时访问 ConcurrentHashMap 时,同一时间只有一个线程能操作相应的节点,这样就保证了ConcurrentHashMap 的线程安全了

相关推荐
愿你天黑有灯下雨有伞10 分钟前
告别复杂配置!Spring Boot优雅集成百度OCR的终极方案
spring boot·百度·ocr
wjs20242 小时前
状态模式(State Pattern)
开发语言
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子6 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友