【亮剑】Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap

简介: 【4月更文挑战第30天】本文介绍了Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap。文章展示了创建、添加、获取、删除和遍历元素的基本用法。ConcurrentHashMap的内部实现基于分段锁,每个段是一个独立的Hash表,通过分段锁实现并发控制。每个段内部采用数组+链表/红黑树的数据结构,当冲突过多时转为红黑树优化查询。此外,它有扩容机制,当元素超过阈值时,会逐段扩容并翻倍Segment数量,以保持高性能的并发访问。

一、引言

在多线程环境下,为了保证数据的一致性和并发性能,我们通常会使用到并发容器。而在Java中,ConcurrentHashMap就是一种非常常用的并发容器。它是JDK1.5中引入的,用于替代HashTable和SynchronizedMap等同步容器,提供了更好的并发性能。本文将详细介绍ConcurrentHashMap的使用方法及其内部实现原理。

二、ConcurrentHashMap的使用方法

  1. 创建ConcurrentHashMap对象
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
   
    public static void main(String[] args) {
   
        ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
    }
}
  1. 添加元素
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
   
    public static void main(String[] args) {
   
        ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put("one", 1);
        concurrentHashMap.put("two", 2);
        concurrentHashMap.put("three", 3);
    }
}
  1. 获取元素
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
   
    public static void main(String[] args) {
   
        ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put("one", 1);
        concurrentHashMap.put("two", 2);
        concurrentHashMap.put("three", 3);

        Integer one = concurrentHashMap.get("one");
        System.out.println("one: " + one);
    }
}
  1. 删除元素
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
   
    public static void main(String[] args) {
   
        ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put("one", 1);
        concurrentHashMap.put("two", 2);
        concurrentHashMap.put("three", 3);

        concurrentHashMap.remove("one");
    }
}
  1. 遍历元素
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
   
    public static void main(String[] args) {
   
        ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put("one", 1);
        concurrentHashMap.put("two", 2);
        concurrentHashMap.put("three", 3);

        for (String key : concurrentHashMap.keySet()) {
   
            System.out.println("Key: " + key + ", Value: " + concurrentHashMap.get(key));
        }
    }
}

三、ConcurrentHashMap的内部实现原理

  1. 分段锁(Segment)

ConcurrentHashMap的核心思想是将整个Map分为N个Segment,每个Segment独立维护一部分数据。这样在进行put、remove等操作时,只需要锁定当前Segment,而不需要锁定整个Map,从而提高并发性能。默认情况下,ConcurrentHashMap会创建16个Segment。

  1. 数据结构

每个Segment内部使用了一个数组来存储键值对,数组的索引通过hashCode计算得到。当发生哈希冲突时,会使用链表或红黑树来解决。当链表长度超过一定阈值时,会转换为红黑树以提高查询效率。

  1. 扩容机制

当某个Segment的元素个数超过阈值时,会触发扩容操作。扩容时,会创建一个新的数组,并将旧数组的数据迁移到新数组中。同时,Segment的数量也会翻倍。为了减少锁的粒度,ConcurrentHashMap采用了逐段扩容的策略,每次只扩容一个Segment。

四、总结

本文详细介绍了ConcurrentHashMap的使用方法及其内部实现原理。通过分段锁的设计,ConcurrentHashMap在保证数据一致性的同时,提供了较好的并发性能。在实际应用中,我们可以根据需要选择合适的并发容器,以提高系统的性能。

相关文章
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
320 3
|
Java
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
本文深入解析了ConcurrentHashMap的实现原理,涵盖JDK 7与JDK 8的区别、静态代码块、构造方法、put/get/remove核心方法等。JDK 8通过Node数组+链表/红黑树结构优化并发性能,采用CAS和synchronized实现高效锁机制。文章还详细讲解了hash计算、表初始化、扩容协助及计数更新等关键环节,帮助读者全面掌握ConcurrentHashMap的工作机制。
360 6
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
|
缓存 安全 Java
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
ConcurrentHashMap是Java中线程安全的哈希表实现,支持高并发读写操作。相比Hashtable,它通过分段锁(JDK1.7)或CAS+synchronized(JDK1.8)实现更细粒度锁控制,提升性能与安全性。本文详细介绍其构造方法、添加/获取/删除元素等常用操作,并对比JDK1.7和1.8的区别,帮助开发者深入理解与使用ConcurrentHashMap。欢迎关注,了解更多!
1086 5
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
存储 安全 Java
Java集合类面试十七】、介绍一下ConcurrentHashMap是怎么实现的?
ConcurrentHashMap在JDK 1.7中通过分段锁实现线程安全,在JDK 1.8中则采用Node数组配合链表和红黑树,并使用Synchronized和CAS操作提高并发性能。
Java集合类面试十七】、介绍一下ConcurrentHashMap是怎么实现的?
|
存储 Java
Java 中 ConcurrentHashMap 的并发级别
【8月更文挑战第22天】
296 5
|
算法 Java
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
ConcurrentHashMap通过分段锁(Segment)实现高效并发访问,get操作无需加锁,而put操作首先判断是否需要扩容,然后通过两次hash定位并尝试使用CAS和锁机制安全地添加元素。
|
安全 Java
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
HashMap是非线程安全的,而ConcurrentHashMap通过减少锁粒度来提高并发性能,检索操作无需锁,从而提供更好的线程安全性和性能。
|
10月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1311 108