多线程环境下,如何实现一个 Hash 结构?介绍一下 ConCurrentHashMap 的底层原理?

简介: 多线程环境下,如何实现一个 Hash 结构?介绍一下 ConCurrentHashMap 的底层原理?

1. 多线程环境下,如何实现一个 Hash 结构?

在多线程并发环境下,我们可以使用 ConcurrentHashMap 来实现这样一个需求。

2. 介绍一下 ConcurrentHashMap 的底层原理?

ConcurrentHashMap 的话要分为两种情况分析,一种是在 JDK1.7,一种是在 JDK8 之后,他们之间的差别是比较大的。

在 JDK1.7 的话:它的底层是使用数组 + 链表来实现的,使用分段锁来保证线程安全,它将数组分成 16 段,也就是给每个 Segment 来配一把锁,在读每个 Segment 的时候先获取对应的锁,所以它最多能有 16 个线程并发去操作

JDK1.7 的 ConcurrentHashMap 介绍:

Segment

ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表” 部分 “或” 一段 “的意思,所以很多地方都会将其描述为分段锁。

线程安全(Segment 继承 ReentrantLock 加锁)

简单理解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承

ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。

并行度(默认 16

concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是 16,也就是说 ConcurrentHashMap 有 16 个 Segments,所以理论上,这个时候,最多可以同时支持 16 个线程并发写,只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个 Segment 内部,其实每个 Segment 很像之前介绍的 HashMap,不过它要保证线程安全,所以处理起来要麻烦些。

到了 JDK1.8 之后:跟 HashMap 一样,也引入了这种红黑树的结构。同时在并发处理方面,不再使用分段锁的方式,而是采用 CAS 加 synchronized 关键字这种方式来实现一种更加细粒度的锁,相当于是把这个锁控制在了更加细粒度的哈希桶的这个级别。然后在写入键值对的时候可以锁住哈希桶的这种链表的头节点,这样就不会影响到其他的哈希桶的写入,从而提高对并发的这种处理能力。


相关文章
|
8天前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
53 0
|
8天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
8天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
71 0
|
8天前
|
算法 Unix 调度
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
50 0
|
7天前
|
消息中间件 SQL Kubernetes
实时计算 Flink版产品使用合集之多线程环境中,遇到 env.addSource 添加数据源后没有执行到 env.execut,是为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
16 1
|
8天前
|
消息中间件 安全 Ubuntu
【操作系统原理】—— 线程同步
【操作系统原理】—— 线程同步
|
8天前
|
存储 Java Python
【Python小知识】如何解决代理IP在多线程环境下的并发问题?
【Python小知识】如何解决代理IP在多线程环境下的并发问题?
|
8天前
|
Java 调度
《Java 多线程实战系列》- 01 基本概念与底层原理
《Java 多线程实战系列》- 01 基本概念与底层原理
19 0
|
8天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
26 2
|
8天前
|
Java
Java线程通信的精髓:解析通知等待机制的工作原理
Java线程通信的精髓:解析通知等待机制的工作原理
28 3
Java线程通信的精髓:解析通知等待机制的工作原理