尚硅谷#ConcurrentHashMap 锁分段机制

  • ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用==“锁分段”==机制替代 Hashtable 的独占锁。进而提高性能。
    在这里插入图片描述

  • 锁粒度
    减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是 ConcurrentHashMap(高性能的HashMap)类的实现。对于 HashMap 而言,最重要的两个方法是 get 与 set 方法,如果我们对整个 HashMap 加锁,可以得到线程安全的对象,但是加锁粒度太大。Segment 的大小也被称为 ConcurrentHashMap 的并发度。

  • 锁分段
    ConcurrentHashMap,它内部细分了若干个小的 HashMap,称之为段(Segment)。默认情况下 一个 ConcurrentHashMap 被进一步细分为 16 个段,既就是锁的并发度。
    如果需要在 ConcurrentHashMap 中添加一个新的表项,并不是将整个 HashMap 加锁,而是首 先根据 hashcode 得到该表项应该存放在哪个段中,然后对该段加锁,并完成 put 操作。在多线程 环境中,如果多个线程同时进行put操作,只要被加入的表项不存放在同一个段中,则线程间可以做到真正的并行。

  • 其它
    此包还提供了设计用于多线程上下文中的 Collection 实现:
    ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、 CopyOnWriteArrayList 和 CopyOnWriteArraySet。
    当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap, ConcurrentSkipListMap 通常优于同步的 TreeMap。
    当期望的读数和遍历远远 大于列表的更新数时,CopyOnWriteArrayList 优于同步的 ArrayList。(添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。)

### 关于JUC (Java Util Concurrency) 的概述 并发编程中的同步机制对于多线程环境下的数据一致性至关重要。`ConcurrentHashMap` 是 `Hashtable` 和 `synchronizedMap` 的替代品,在高并发场景下性能更好[^2]。 #### ConcurrentHashMap的工作原理 在 JDK 1.7 中,`ConcurrentHashMap` 使用分段数组加链表的方式存储键值对,并通过 `ReentrantLock` 定整个哈希桶数组的一部分来控制并发访问;而在 JDK 1.8 及之后版本里,则采用了类似于 `HashMap` 的设计——即当遇到哈希碰撞时采用链表或者红黑树结构保存溢出的数据项,不过不同之处在于其利用 CAS 操作以及 Synchronizer 来确保线程安全性的同时提高了并行度。 #### 原子操作与优化 原子变量类提供了无定且高效的算法实现方式,比如 `AtomicInteger`, `AtomicLong` 等可以用于计数器等简单数值更新场合。此外还有诸如读写(`ReadWriteLock`)、信号量(`Semaphore`)等一系列工具可以帮助开发者更好地处理复杂的业务逻辑需求。 #### 弱引用的应用 除了上述内容外,在某些特殊情况下可能还会涉及到对象生命周期管理方面的话题,例如使用弱引用来追踪那些不再被强引用指向但仍可作为缓存使用的实例。需要注意的是,这类对象会在下次垃圾收集过程中被清理掉[^3]。 ```java import java.util.concurrent.locks.ReentrantLock; // 创建一个显式的重入 final ReentrantLock lock = new ReentrantLock(); lock.lock(); // 获取 try { // 访问共享资源... } finally { lock.unlock(); // 释放 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值