`

【Java核心-基础】ConcurrentHashMap 高效地线程安全简介

    博客分类:
  • Java
 
阅读更多

JDK提供了一些线程安全的集合。
有粗粒度 synchronized 的集合。如,Hashtable、Collections.synchronizedXxx 包装的集合。
有细粒度,基于分离锁实现的集合。如,ConcurrentHashMap。
通常,并发包中提供的容器性能远优于早期的简单同步实现。

 

为什么需要ConcurrentHashMap?

HashMap 不是线程安全的。在并发场景中,可能会出现类似CPU占用100%之类的问题(死循环)。
 

Hashtable 和 Collections.synchronizedMap() 包装的HashMap:
内部都是通过 synchronized 同一把锁,来同步所有并发操作(put、get、size 等)。
这导致一个线程在操作时,其它线程只能等待,并发效率低。
它们只适合在并发程度较低的场景下使用。

 

ConcurrentHashMap 如何做到高效地线程安全?

ConcurrentHashMap 的设计实现一直在演化。不同JDK版本中的实现可能有较大改动。
 

Java 7


 

分离锁。内部分段(Segment,继承自ReentrantLock),段内是HashEntry数组,hash值相同的条目以链表形式存放。
HashEntry 内部用 volatile 的 value 字段保证可见性。利用Unsafe提供的底层能力优化性能。
Segment 的数量默认为16,可在相应的构造方法中指定(concurrencyLevel)。
 

并发操作时,只需锁定相应段,避免整体同步,以提高性能。

PUT:先对key的hash值再次hash,以减少hash冲突。然后利用Unsafe获取相应的Segment,再进行线程安全的put操作。

GET:需要可见性保证,没有同步逻辑。

 

Java 8 开始


 

  • 总体结构与HashMap相似:桶数组(Buckets) + 内部链表(bin),同步粒度更细。
  • 保留Segment定义,但仅用于保证序列化兼容性,不再有任何结构上的用处。
  • 不再使用Segment后,初始化操作简化,改为 lazy-load 形式,减小初始化开销
  • size() 方法还是采用分而治之的算法。但使用了内部类 CounterCell(基于 LongAdder 和 Striped64)
  • 使用 synchronized 作同步。因为 synchronized 已被优化,无需过分担心性能;内存消耗比 ReentrantLock 少。
  • 更多地使用CAS等底层技术实现无锁化并发操作(Unsafe、AtomicReference等)
    如,利用 volatile 字段 sizeCtl 来实现互斥
pivate final Node<K, V>[] initTable() {
  Node<K,V>[] tab; int sc;
  while ((tab = table) == null || tab.length == 0) {
    if ((sc = sizeCtl) < 0)
      // 存在多线程冲突,需等待
      Thread.yield();
    else if (U.compareAndSetInt(this, SIZECTL, sc, -1)) {
      // CAS 成功,进入真正的初始化逻辑
      ...
    }
  }
  return tab;
}

 

 

  • 大小: 37.4 KB
  • 大小: 26.2 KB
分享到:
评论

相关推荐

    java基础--11.多线程

    Java多线程是Java编程中的核心概念,尤其在开发高并发、高性能的应用程序时不可或缺。在Java中,多线程允许程序同时执行多个任务,从而提高系统资源的利用率和响应速度。下面我们将深入探讨Java多线程的相关知识点。...

    基于JAVA毕业设计-JAVA多线程与线程安全实践-基于Http协议的断点续传.rar

    首先,Java多线程是并发编程的基础,它允许程序同时执行多个任务,提高系统资源利用率。Java提供了多种方式创建和管理线程,如`Thread`类和`Runnable`接口。在实现断点续传功能时,可能需要创建多个线程分别处理不同...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    这本书聚焦于Java多线程的核心概念和技术,旨在帮助开发者理解和掌握如何在并发环境中高效、安全地编写代码。 在Java世界中,多线程是实现并发处理和充分利用系统资源的关键技术。Java 10虽然不是多线程特性的重大...

    Java 多线程与并发(13-26)-JUC集合- ConcurrentHashMap详解.pdf

    【Java 多线程与并发】并发集合类`ConcurrentHashMap`是Java程序设计中一个重要的工具,尤其在高并发场景下,它提供了高效的线程安全。`ConcurrentHashMap`在JDK 1.7和1.8中有着显著的区别。 在JDK 1.7中,`...

    基于Java的源码-超简单Java多线程填表源码.zip

    - Java的`java.util.concurrent`包提供了线程安全的集合类,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等,它们在并发环境下提供了高效的数据操作。 9. **线程局部变量(ThreadLocal)**: ...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java基础-个人总结-超详细清楚-用于面试-针对无基础或有基础回忆.docx

    Java基础是编程学习的核心部分,本总结主要涵盖了Java语言的基础概念和常见问题,适用于初学者和需要回顾基础知识的开发者。以下是对这些知识点的详细解释: 1. **基本数据类型**: - Java提供了八种基本数据类型...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **ConcurrentHashMap**:线程安全的哈希表,比`synchronized` Map更高效。 - **BlockingQueue**:用于线程间的数据传递,提供阻塞操作,常用于线程池的实现。 - **Atomic类**:提供原子操作,如`AtomicInteger`...

    Java线程-第三版(CHM电子版)

    这些工具能帮助开发者更高效、安全地管理线程。 4. **线程池**:介绍线程池的设计理念和实现方式,解释`ExecutorService`和`ThreadPoolExecutor`的工作原理,以及如何根据需求配置和管理线程池,以优化性能和资源...

    Java-JUC-多线程 进阶

    为了解决这个问题,Java 提供了多种线程安全的集合类,例如 Vector、CopyOnWriteArrayList、ConcurrentHashMap 等。 Callable Callable 是 Java 中的一种函数式接口,用于描述可被线程池执行的任务。Callable 接口...

    java核心知识-word版2

    9. **并发编程**:Java并发库包含许多高级工具,如ExecutorService、Future、Callable和Fork/Join框架,以及并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList,帮助开发者编写高效、安全的多线程代码。...

    JAVA核心技术--高级特征(第八版)--第三部分

    《JAVA核心技术--高级特征(第八版)--第三部分》是一本深入探讨Java编程高级特性的权威指南,涵盖了Java语言的精髓和最新发展。本书分为四部分,确保全面且系统地讲解了Java开发中的关键知识点,而这里我们将聚焦于第...

    java多线程,对多线程,线程池进行封装,方便使用

    Java提供了synchronized关键字、Lock接口(如ReentrantLock)以及各种并发容器(如ConcurrentHashMap)来保证线程安全。 10. **线程池的最佳实践** - 核心线程数应根据系统资源和业务需求设定,一般可设为CPU核心...

    Java-核心篇.zip

    8. **并发编程最佳实践**:学习如何编写高效、安全且可维护的多线程代码,包括线程安全的设计模式和编程技巧。 通过这份资源,你将能够提升自己在Java多线程编程方面的技能,更好地应对复杂的并发问题。无论是进行...

    Java并发编程之ConcurrentHashMap.pdf

    `ConcurrentHashMap`是Java并发编程中的一个重要组件,它提供了一种线程安全的哈希表实现方式。与传统的`Hashtable`或`synchronized`关键字相比,`ConcurrentHashMap`的设计更高效、更灵活。它允许在读操作时不加锁...

    JAVA语言程序设计-第十四章 多线程

    在JAVA语言程序设计中,第十四章主要探讨的是多线程这一核心概念。多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程是通过实现Runnable...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...

    【JAVA多线程】多线程编程核心技术学习资料

    3. 线程安全的数据结构:如ConcurrentHashMap、Atomic系列类(AtomicInteger、AtomicReference等),这些类提供了在并发环境下的高效操作,避免了数据不一致的问题。 4. 守护线程(Daemon Thread):这种线程在没有...

    Java线程基础教程完整版

    通过深入学习和实践这些Java线程基础知识,你可以有效地编写出高效、安全的多线程程序。记住,理解线程的原理和掌握同步机制是关键,这将有助于解决复杂的并发问题。阅读"Java线程.pdf"文档,你将获得更详细、全面的...

    java多线程控制的赛跑程序

    通过这个赛跑程序,我们可以学习到如何在Java中有效地控制和管理多线程,理解并发编程的核心概念,并掌握处理线程安全、同步和通信的技巧。同时,这个程序还可能包含对性能优化、错误处理以及日志记录的实践。通过...

Global site tag (gtag.js) - Google Analytics