Java 7与 Java 8中ConcurrentHashMap的实现原理对比分析

开发 后端
Java 7中的ConcurrentHashMap:使用了分段锁机制,存储结构为数组+链表,锁的粒度是基于段的,不支持动态扩容。Java 8中的ConcurrentHashMap:使用CAS+Synchronized实现线程安全性,存储结构为数组+链表/红黑树+链表,锁的粒度更细,支持动态扩容,并引入了并发度的概念。​

ConcurrentHashMap是Java中线程安全的哈希表实现。

ConcurrentHashMap的由来:

Java 7和Java 8中ConcurrentHashMap的实现原理的简要解析:

Java 7中的ConcurrentHashMap实现原理:

分段锁(Segment-based Locking)

  • Java 7中的ConcurrentHashMap采用分段锁的机制,将整个数据结构分割为多个段(Segment)。
  • 每个段维护一个自己的哈希表,具有自己的锁。
  • 每次对ConcurrentHashMap的操作只需要获取对应段的锁,不会锁住整个数据结构,从而提高并发性能。

HashEntry数组

  • ConcurrentHashMap内部使用HashEntry数组来存储键值对。
  • HashEntry是一个包含键、值和next指针的节点,用于解决哈希冲突。
  • 哈希冲突的解决方法是采用链表法(链表存储相同哈希值的键值对)。

获取锁的方式

  • 在Java 7中,获取锁的方式是通过synchronized关键字来实现的。
  • 每个Segment维护自己的锁,并且对于读操作采用乐观锁机制,对于写操作采用悲观锁机制。

ConcurrentHashMap机构


Java 8中的ConcurrentHashMap实现原理:

CAS操作和Synchronized

  • Java 8中的ConcurrentHashMap使用CAS(Compare and Swap)操作来实现并发安全性。
  • 使用CAS操作可以避免锁的竞争和阻塞。
  • Java 8中的ConcurrentHashMap还引入了一种称为"红黑树"的新数据结构,用于优化存储大量键值对的情况。

Node数组和红黑树:

  • Java 8中的ConcurrentHashMap使用了类似HashMap的Node数组来存储键值对。
  • 当某个位置的链表长度超过一定阈值时,会将链表转换为红黑树,以提高查找、插入和删除操作的效率。
  • 红黑树是一种平衡二叉树,具有较快的查找和插入性能。

分段锁的改进:

  • Java 8中的ConcurrentHashMap取消了分段锁机制,采用更细粒度的锁来实现并发控制。
  • ConcurrentHashMap的数据结构被分割成多个独立的部分,每个部分维护自己的锁。
  • 通过细粒度的锁机制,使得读操作可以并发执行,提高了并发性能。

ConcurrentHashMap机构


总结:

Java 7中的ConcurrentHashMap:使用了分段锁机制,存储结构为数组+链表,锁的粒度是基于段的,不支持动态扩容。

Java 8中的ConcurrentHashMap:使用CAS+Synchronized实现线程安全性,存储结构为数组+链表/红黑树+链表,锁的粒度更细,支持动态扩容,并引入了并发度的概念。

这些改进使Java 8的ConcurrentHashMap在并发性能、内存占用和可扩展性方面得到了显著的提升,适用于高并发的多线程环境下的安全哈希表操作。

责任编辑:姜华 来源: 今日头条
相关推荐

2015-06-15 10:12:36

Java原理分析

2021-05-18 10:18:15

Java

2018-01-26 14:29:01

框架

2018-01-21 14:11:22

人工智能PaddlePaddlTensorflow

2010-07-20 16:16:21

SDH

2023-03-26 00:53:04

camunda7camunda8流程引擎

2017-03-20 14:32:57

2023-05-14 22:00:01

2019-09-26 09:42:44

Go语言JavaPython

2020-08-17 12:49:23

苹果原理图芯片

2010-06-08 11:15:43

OpenSUSE Ub

2015-03-09 15:06:20

javaphpweb开发

2010-08-04 15:47:24

NFS版本

2020-09-22 12:00:23

Javahashmap高并发

2024-08-08 07:38:42

2016-10-18 21:10:17

GitHubBitbucketGitLab

2020-04-24 16:00:58

存储分析应用

2010-07-14 10:26:58

IMAP协议

2009-03-05 14:56:08

TomcatGeronimoJBoss

2010-06-24 21:35:33

点赞
收藏

51CTO技术栈公众号