ConcurrentHashMap面试题总结

本文详细介绍了Java ConcurrentHashMap从JDK7到JDK8的变化,包括其内部结构、节点类型、扩容机制、数据迁移过程以及并发控制策略。讨论了为何在红黑树节点上不直接加锁的原因,并分析了put、get、size等核心操作的实现细节。
摘要由CSDN通过智能技术生成

1、简要介绍

Java7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变。

Java8 中的 ConcurrentHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java7 中的 Segment 数组 + HashEntry 数组 + 链表 进化成了 Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。

2、jdk1.5之前,jdk提供的Map同步容器有:

1、使用Hashtable类。Hashtable使用synchronized同步锁修饰put、get、remove等方法,读写只能串行进行,性能低下。

2、使用Collections.synchronizedMap返回一个同步代理类synchronizedMap。可以将指定集合包装成线程同步的集合。

3、

ConcurrentHashMap继承了Abstract抽象类,实现了ConcurrentMap接口。

Abstract抽象类减少了实现Map数据结构的工作量,ConcurrentMap接口提供了线程安全性和原子保证。

4、节点类型有5种:只有Node节点和TreeNode节点存储着真实的数据。
1、Node:连接着一个链表。

2、TreeBin:红黑树的顶级节点,hash值固定为-1,TreeBin连接着一个红黑树,红黑树节点时TreeNode,TreeBin指向红黑树的根节点。

3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值