Java刷题错题笔记-day04-集合

本文详细解释了JDK8中ConcurrentHashMap的数据结构(数组+链表+红黑树),以及其如何通过CAS和synchronized机制保证线程安全,以及volatile关键字和CAS操作确保数据一致性。
摘要由CSDN通过智能技术生成

1.在JDK8中,ConcurrentHashMap的数据结构是怎样的?

数组+链表+红黑树,和HashMap一样

  1. Node数组: ConcurrentHashMap内部维护一个Node数组,其中每个Node就是键值对的存储单元。
  2. 链表: 每个Node实际上是一个链表的头节点。当发生哈希冲突时,新的节点会被添加到对应位置的链表中。
  3. 红黑树: 当链表长度达到一定阈值(默认是8),链表会被转换成红黑树。这是为了在高并发情况下提高查找效率。

2.在JDK8中,ConcurrentHashMap如何保证线程安全的?

运用CAS+synchronized机制

ConcurrentHashMap在putVal方法中,添加元素时,
若链表为空,此时使用CAS乐观锁机制添加元素
若链表不为空,(存在Hash冲突场景)使用synchronized悲观锁来保证线程安全

3.在JDK8中,ConcurrentHashMap的get方法如何保证数据一致性的?

volatile+CAS(修改操作时)

1.volatile关键字:ConcurrentHashMapNode类中,键值对的value字段被声明为volatile。这意味着对该字段的读取和写入操作都是原子的,并且会立即被其他线程可见。这有助于确保当一个线程修改了Node中的值时,其他线程能够立即看到最新的值。

static class Node<K,V> implements Map.Entry<K,V> {
   final int hash;
   final K key;
   volatile V val;
   volatile Node<K,V> next;
    // ...
}

2.CAS操作: ConcurrentHashMap使用CAS操作来更新Node中的值。当多个线程同时尝试更新同一个Node的值时,只有一个线程会成功,其他线程需要重试。这确保了在并发情况下对Node值的更新是线程安全的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸魚散人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值