面试官:说一下currenthashmap怎么保证并发正确

简介: 面试官:说一下currenthashmap怎么保证并发正确

JDK1.7 的concurrentHashMap

结构:JDK1.7版本的concurrentHashMap和JDK1.7的hashmap的结构的区别就是加上了一层segment数组,当然加上这个数组也是为了并发时候的安全性,所以其结构就是segment数组+数组+链表的结构,每个segment中的有一个数组+链表的结构,初始的大小为16,阈值也是0.75。

安全机制:

对于jdk1.7的concurrenthashmap的安全性,是通过synchronized加在segment数组上来保证的,也就是我们常说的段锁,对于一个段加锁之后,这个段上其他的节点就不能被操作了,但是一个段上加锁之后,并不影响其他段的操作,所以就在安全的环境下大大提高了并发性。

 

JDK1.8的concurrentHashMap

结构和安全机制

JDK1.8版本的concurrentHashMap和JDK1.8的hashmap的结构的区别就是使用了synchronized和CAS机制,当然加上synchronized和CAS机制也是为了并发时候的安全性,所以主要是操作的时候加上了锁的影响,在添加数据的时候会先对指定的节点加上Synchronized锁,然后在进行CAS方式插入数据,因为Synchronized锁的是数组中的一个几点而不是整个数组,所以并发也很高,初始的大小为16,阈值也是0.75。

注意:JDK1.8的concurrentHashMap扩容特点:多线程并行扩容,因为synchronized所得是单个节点,所以可以多个线程并行扩容,暴增安全的前提下提高了扩容的速度,其次统计数量的时候如果并发较高可以使用数组统计之后,把数组中的都加到一起。

相关文章
|
2月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
2月前
|
Java 程序员 调度
面试准备-并发
面试准备-并发
|
2月前
|
消息中间件 Java 中间件
复盘女朋友面试4个月的并发面试题
该文章主要复盘了关于并发的面试题,包括线程池的使用场景、原理、参数合理化设置,以及ThreadLocal、volatile、synchronized关键字的使用场景和原理,还介绍了juc并发工具包中aqs的原理,强调在面试中要将自己理解的点与面试官讲透。
复盘女朋友面试4个月的并发面试题
|
2月前
|
JavaScript 前端开发 Java
面试官:假如有几十个请求,如何去控制并发?
面试官:假如有几十个请求,如何去控制并发?
|
2月前
|
安全 Go 调度
[go 面试] 深入理解并发控制:掌握锁的精髓
[go 面试] 深入理解并发控制:掌握锁的精髓
|
2月前
|
算法 Go 数据库
[go 面试] 并发与数据一致性:事务的保障
[go 面试] 并发与数据一致性:事务的保障
|
2月前
|
NoSQL Go API
[go 面试] 为并发加锁:保障数据一致性(分布式锁)
[go 面试] 为并发加锁:保障数据一致性(分布式锁)
|
3月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
64 1
|
3月前
|
安全 算法 Java
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
45 1
|
3月前
|
设计模式 安全 Java
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
36 1