• 多线程(74)分段锁


    分段锁(Segmented Locking)是一种用于提高多线程程序性能的锁机制,通过将锁细分来减少竞争,从而在高并发环境中提高性能。分段锁在Java的ConcurrentHashMap中有广泛应用。

    分段锁的工作原理

    分段锁的基本思想是将锁分为多个段(Segment),每个段独立加锁,这样在并发环境下,不同的线程可以同时操作不同的段,从而减少锁竞争,提高并发访问率。相比于一个全局锁来说,分段锁提供了更细粒度的锁控制,允许更高的并发。

    Java中分段锁的示例

    以一个简化版本的基于分段锁思想实现的ConcurrentHashMap为例,来演示分段锁的实现。请注意,这里的实现是为了演示分段锁的概念,而非完整的ConcurrentHashMap实现。

    import java.util.HashMap;
    import java.util.Map;
    
    public class SegmentedHashMap<K, V> {
        // 分段锁的数量,通常设为2的n次方
        private static final int SEGMENTS = 16;
        private final Segment<K, V>[] segments;
    
        // 初始化所有的段
        @SuppressWarnings("unchecked")
        public SegmentedHashMap() {
            segments = (Segment<K, V>[]) new Segment[SEGMENTS];
            for (int i = 0; i < SEGMENTS; i++) {
                segments[i] = new Segment<>();
            }
        }
    
        // 根据key获取对应段的索引
        private int getSegmentIndex(K key) {
            return key.hashCode() & (SEGMENTS - 1);
        }
    
        // 放入键值对
        public void put(K key, V value) {
            int index = getSegmentIndex(key);
            segments[index].put(key, value);
        }
    
        // 根据key获取值
        public V get(K key) {
            int index = getSegmentIndex(key);
            return segments[index].get(key);
        }
    
        // 每个段的实现
        private static class Segment<K, V> {
            private final Map<K, V> map = new HashMap<>();
            private final Object lock = new Object(); // 每个段的锁
    
            // 放入键值对,加锁以保证线程安全
            public void put(K key, V value) {
                synchronized (lock) {
                    map.put(key, value);
                }
            }
    
            // 根据key获取值,加锁以保证线程安全
            public V get(K key) {
                synchronized (lock) {
                    return map.get(key);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这个示例中,SegmentedHashMap通过一个Segment数组实现了分段锁。每个Segment独立加锁,从而允许多线程可以同时对不同的段进行操作。通过getSegmentIndex(K key)方法根据键的哈希码计算出键所在的段的索引,从而确定操作哪一个段。

    分段锁的优势

    • 高并发性能:在多线程环境下,通过减少锁的竞争,提高了并发性能。
    • 减少阻塞时间:线程操作不同的段时可以同时进行,从而减少了线程阻塞的时间。

    分段锁的劣势

    • 内存开销:每个段都有自己的锁,相比于单一锁,分段锁会有更多的内存开销。
    • 实现复杂性:分段锁的实现比单一锁复杂,需要仔细设计段的数量和大小,以及如何映射键到特定的段上。

    结论

    分段锁是一种有效的提高并发性能的锁机制,尤其适用于高并发环境下的数据结构,如ConcurrentHashMap。然而,其实现相对复杂,且有一定的内存开销,因此在使用时需要权衡其优缺点。

  • 相关阅读:
    逍遥自在学C语言 | break-循环的中断与跳转
    卷积神经网络基础概念理解(二)
    【JAVA并发】AQS原理详解
    数据分析实战应用案例精讲-【概念篇】用户画像(最终篇)(附实战案例)
    3.nodejs--模块化
    MySQL主从复制与读写分离
    力扣(LeetCode)算法_C++——有效的数独
    8月1日第壹简报,星期一,农历七月初四
    如何理解图神经网络的傅里叶变换和图卷积
    作为一个程序员,如何高效的管理时间?
  • 原文地址:https://blog.csdn.net/qq_43012298/article/details/136782968