concurrentHashMap 跟 hashmap 也是一个套路,1.7 以前版本是什么样,1.8 版本是什么样。为什么能做到线程安全的?插入、读取元素时的过程(1.7、1.8 的优化)。 在 1.7 之前,ConcurrentHashMap 使用的是 segment数组+分段锁的方法,在插入元素时首先会计算这个 key 的 hashcode,然后找到 指定位置的segment数组,如果指定的数组为空,则进行初始化并插入元素,如果不为空,则先获取锁,然后计算 key 值存放的位置,再进行插入元素,获取不到锁的会进行自旋等待获取锁。 1.7 之后,concurrentHashMap 取消了 segment 数组,使用跟 hashMap 一致的结构,在插入元素时会采用 CAS尝试写入数据,失败之后再用synchronized 锁的方式来保证一定能写入,来实现线程安全。 那么如何做到其他线程可以知道当前线程的数据修改呢?通过利用 volatile 关键字修饰,保证修改可见性,并且写操作时会进行 cas+重试以及 synchronized写入数据,就能保证写操作的并发安全。这两个 点解决了 ConcurrentHashmap 的读写并发安全性。

相关推荐

面试体验是很棒的,面试官都非常准时,面试过程中也会去引导,会沿着你的回答继续去问自我介绍项目介绍项目中提到的线程池干什么用的?还有什么创建线程池的方法?线程池的核心参数。拒绝策略?线程池收到任务后执行流程?如果请求量比较大怎么调参数?项目中 ConcurrentHashMap 干什么用的?为什么要用他别的不行吗?如果不用他你会怎么实现?介绍项目中对接ai生成可视化图表。项目中用 ThreadLocal 做什么的?知道 ThreadLocal的内存泄露问题吗?为什么要把key设置为弱引用? ThreadLocal底层是怎么实现的?为什么要用Redis作缓存?Redis为什么快?Redis雪崩和击穿问题。Redis大key问题。如果让你来设计你会用什么思路解决?除了缓存Redis还能干什么?用过Redis当消息队列吗?为什么不如MQ?刚刚提到Redis持久化机制,介绍一下。聊了聊笔试的第三题派对男女匹配问题说一下常见的排序算法,手撕归并介绍jvm垃圾回收算法。怎么判断对象是否是垃圾?假如你项目上线后突然有个功能出现故障了,要怎么办?之后就聊了聊学校学习的一些事,如果要学习新知识会怎么学?看视频还是看文章?怎么做技术选型的?问了下个人优点,有没有考研打算,为什么不考研?之前参加过多少面试?准备面试多久了?平时会去背八股吗?那如果遇到八股没背到的东西怎么回答呢?
查看16道真题和解析
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务