首页 > 其他分享 >一文说透ConcurrentHashMap及大厂面试题

一文说透ConcurrentHashMap及大厂面试题

时间:2024-07-24 17:29:51浏览次数:9  
标签:黑树 面试题 CAS ConcurrentHashMap 更新 链表 并发 线程 大厂

23年毕业半年被裁后,一个月斩获大厂offer,“跟着周哥走,offer手里有”。文中有周哥50+场面试总结出的必会面试题。

本期说一下ConcurretHashmap及相关知识点的面试题及答案。

注:接下来的内容来自本人整理的面试秘籍。
点击此处,免费获取面试秘籍

jdk1.7中和jdk1.8中ConcurretHashMap的区别?

jdk1.7中:

  • 分段锁:JDK 1.7 中使用分段锁(ReentrantLock + Segment + HashEntry),相当于把一个 HashMap 分成多个段,每段分配一把锁,不同段之间可以并发访问。锁粒度:基于 Segment,包含多个 HashEntry。相当于一个锁管多条链表。

  • HashEntry数组:每个段内部是一个 HashEntry 数组,数组中每个元素都是一个链表,用于解决哈希冲突。

jdk1.8中:

  • CAS(无锁算法)+synchronized+Node+红黑树:引入了 CAS(Compare and Swap)操作,使用了 synchronized 关键字,节点结构变为 Node,并引入了红黑树(当链表长度达到一定阈值时,链表会转换为红黑树,提高查询效率)。锁粒度:Node,粒度降低了,相当于一个锁管一条链表。
  • Node替代HashEntry
  • 引入了红黑树

更新元素时,先回去synchronized锁定的node,然后便利链表或红黑树,找到需要修改的key,使用CAS判断值是否等于预期值,若等于,说明在此期间没被其他线程修改过,则更新,否则不更新或重试。(CAS操作一气呵成,不会被打断,是原子操作)

注:

ConcurrentHashMap的并发度是指:程序运行时能够同时更新 ConccurentHashMap 且不产生锁竞争的最大线程数。默认为 16,且可以在构造函数中设置。当用户设置并发度时,ConcurrentHashMap 会使用大于等于该值的最小2幂指数作为实际并发度(假如用户设置并发度为17,实际并发度则为32)。

对红黑树的理解

红黑树是一个自平衡的二叉查找树(BST)。

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL,java中为null)是黑色。
  • 性质4:每个红节点的两个子节点一定都是黑色。
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
    红黑树中,平衡的概念是通过性质4(红节点不相邻)和性质5(黑平衡)来定义的,保证了红黑树的高度相对较小。

对CAS怎么理解?

CAS(Compare and Swap,比较与交换)是一种多线程同步的原子操作,用于实现多线程环境下的并发算法。

执行过程为:

  • 读取内存位置的当前值。
  • 检查读取的值是否等于预期值。
    • 如果等于,则说明内存位置的值没有被其他线程修改,可以执行更新操作。
    • 如果不等于,说明其他线程已经修改了内存位置的值,操作失败,需要重新尝试或采取其他策略。
    • 如果相等,则使用新值更新内存位置的值。
  • 以上操作一气呵成,不会被其他线程打断,因此CAS是原子性的。

CAS 的优势在于它是一种非阻塞算法,不需要使用锁,避免了锁的开销和可能引起的死锁问题。它是一种乐观锁的实现,通过不加锁的方式进行并发控制。

CAS实现类有:AtomicInteger(提供了一个整数变量的原子操作类)、AtomicLong(提供了长整型变量的原子操作)

**注:**原子操作是指执行过程不被其他线程干扰,要么执行成功要么执行不执行,不存早执行过程被中断的情况。

乐观锁和悲观锁?

乐观锁:

乐观锁是一种并发控制机制,它的基本思想是假设并发冲突的概率较低,因此在绝大多数情况下不会发生冲突。因此,乐观锁不会在访问共享资源之前加锁,而是在更新操作时检查在此期间是否有其他线程对数据进行了修改。

实现方式

  • 方式一:CAS。但存在ABA问题

    • 所谓ABA问题,即一个线程将内存值从A改为B,另一个线程又从B改回到A。
  • 方式二:版本号机制。

    在数据结构中增加一个版本号字段,每次更新时递增版本号。在比较并更新时,不仅要比较值是否相等,还需要比较版本号是否一致。这种方式能够避免 CAS 中的 ABA 问题。

    • JUC中对应版本号机制的类为原子包中的AtomicStampedReference类。
  • 方式三:使用时间戳。

    每个事务或线程在进行更新时附带一个时间戳,当更新时检查时间戳是否一致,从而确定是否发生冲突。这种方式可以解决 ABA 问题,并提供更精确的冲突检测。

工作日每天更新,周末随缘更新。

请关注我,以便及时获取最新内容哦!

个人专栏持续更新
Java 基础秘籍:打破新手困境,迈向高手之路

标签:黑树,面试题,CAS,ConcurrentHashMap,更新,链表,并发,线程,大厂
From: https://blog.csdn.net/zwsfamily/article/details/140621919

相关文章

  • 前端笔试全攻略:30道经典面试题详解
    引言前端开发是一个充满挑战与机遇的领域,随着Web技术的不断发展,前端工程师需要掌握的知识体系也在不断扩展。无论是刚入门的新手还是资深开发者,在求职过程中都会面临各种技术笔试。本文将为你提供30道常见的前端笔试题及其详尽解答,帮助你全面备战前端面试,提升你的前端技能。......
  • JAVA常见面试题-Map接口有哪些实现类
    HashMap、TreeMap、LinkedHashMap、Hashtable、Properties由于Map中结构特点(Key无序的,不可重复,并且使用Set存储所有的key,value无序的,可重复,并且使用Collection存储所有的value)故key所在类需要重写hashCode(),equal()方法,value只需要重写equal。一个键值对:key-value构成了一个......
  • JAVA常见面试题-设计模式(单例模式实现)
    单例模式分为懒汉式与饿汉式,其中饿汉式较为常用。饿汉式publicclassSingleton{   privatestaticSingletoninstance=newSingleton();   privateSingleton(){}   publicstaticSingletongetInstance(){   returninstance; ......
  • Java面试题总结(持续更新)
    1、this关键字和super关键字的区别及联系this关键字用在本类中。在类的内部,可以在任何方法中使用this引用当前对象。this关键字是用来解决全局变量和局部变量之间的冲突。this()可以调用同类中重载的构造方法,并且需要放在第一行。super关键字用在子类中。在子类中可以通......
  • Day08MySQL 面试题 (五)
    MySQL面试题40、完整性约束包括哪些?数据完整性是指数据的精确(Accuracy)和可靠性(Reliability)。分为以下四类:1、实体完整性:规定表的每一行在表中是惟一的实体。2、域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。3、参......
  • 面试题-Java 容器
    List和Set的区别是什么?Vector,ArrayList,LinkedList区别?ArrayList和LinkedList底层是怎么实现的?各自的特点是什么?HashSet和HashMap和的区别?TreeMap和TreeSet区别和实现原理HashMap,Hashtable的区别?HashMap,LinkedHashMap,TreeMap的区别?HashMap,和ConncurrentHashMap......
  • JavaSE异常、今日面试题,解决git合并失败的终极篇!!!若以框架报错Invalid bound statement
    20240723一、JavaSE异常二、今日面试题三、解决git无法合并推送问题(终极篇!!!)1.直接把你写的复制出来,然后输入git命令1.1.解决办法一:保留本地的更改,中止合并->重新合并->重新拉取1.2解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)2.然后复制回来,然后再合并推......
  • 学生选课表练习(面试题)
    所有表都放在最后1.查询”01“课程比”02“课程成绩高的学生的信息及课程分数SELECTDISTINCTstudent.*,t1.scoreFROMstudentINNERJOIN(SELECT*FROMscWHEREsc.Cid=1)t1ONt1.Sid=student.SidINNERJOIN(SELECT*FROMscWHEREsc.Cid=2)t2ON......
  • 2024年最新完整java面试题(含答案)
    1 、面向对象的特征有哪些方面 ? 【基础】答:面向对象的特征主要有以下几个方面:1) 抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是......
  • 面试题:如何解决缓存和数据库的一致性问题?
    所谓的一致性问题是指,在同时使用缓存和数据库的情况下,要确保数据在缓存与数据库中的更新操作保持同步。也就是当对数据进行修改时,无论是先修改缓存还是先修改数据库,最终都要保证两者的数据是一样的,不会出现数据不一样的问题。1.一致性问题解决方案缓存和数据库一致性的经典解决......