hashMap

面试的时候面试官问我
多线程环境下
hashMap正在扩容的时候另外一个线程要执行put操作,是插入到新的table还是旧的table
我一听就蒙了
但是好像似乎就是插入到旧的table里面啊
他又问我 
那旧的table不就一直有新的数据插入吗
我一想 这对啊
完蛋了 我知道他想问我concurrentHashMap
没想到我败在这里
然后我去看了下源码 我还是觉得插入到旧的table里面
有没有人show me 正确的解答呀
全部评论
我又去看了一下,感觉应该是新旧都有!要看扩容进行到哪一步了
2 回复 分享
发布于 2023-07-25 14:55 上海
在Java 8及以后版本中,`ConcurrentHashMap`的扩容操作可以被多个线程并发执行,这种并发执行的设计提高了扩容操作的效率并减少了阻塞时间。 当一个线程检测到需要进行扩容操作(例如,在执行插入操作时发现数组已满)时,它会创建一个新的、容量更大的数组,然后开始将旧数组中的元素转移到新数组中。如果此时有其他线程也试图插入元素,并发现正在进行扩容操作,那么这些线程会尝试帮助执行扩容操作,转移一部分元素到新数组中。在这个过程中,所有线程都会尝试将各自负责的部分转移完毕,直到所有元素都成功转移为止。这个过程中,所有线程操作的都是不同的部分,所以不会出现冲突。 这种设计允许多个线程同时进行扩容操作,以提高效率。然而,实现这种机制的代码会比较复杂,需要非常仔细地设计和实现同步机制,以确保在并发情况下的正确性和线程安全。这也是为什么在多线程环境中,我们推荐使用`ConcurrentHashMap`,而不是`HashMap`或者`Hashtable`的原因。 需要注意的是,这种并发扩容的设计并不意味着`ConcurrentHashMap`的所有操作都可以无限制地并发执行。在某些情况下,例如插入一个新的元素时,可能需要对整个`ConcurrentHashMap`加锁以确保一致性。但是,通过合理的设计和实现,`ConcurrentHashMap`仍然可以在大部分情况下提供比其他类型的Map更好的并发性能。
1 回复 分享
发布于 2023-07-26 09:14 美国
应该是根据扩容程度吧
1 回复 分享
发布于 2023-07-25 17:20 江苏
我记得应该是新的,JDK8扩容的时候是把新table new出来之后就把原引用马上替换了。顺便问下楼主面的哪家,不会是杭州某厂吧?
点赞 回复 分享
发布于 2023-07-30 13:55 台湾
redis不就加入新的吗,新的只进,旧的只出
点赞 回复 分享
发布于 2023-07-25 18:22 江苏
不应该加入线程保护吗,扩容完在插入?
点赞 回复 分享
发布于 2023-07-25 14:25 江苏
应该是插入新的里面,所以才会导致哈希碰撞或者丢失一类的问题
点赞 回复 分享
发布于 2023-07-25 14:04 香港
应该是加入到新的
点赞 回复 分享
发布于 2023-07-25 13:49 陕西

相关推荐

不愿透露姓名的神秘牛友
07-10 11:27
明天又是董事长面,啥时候是个头啊
在太阳里长大的人:公司就仨人吧😂
点赞 评论 收藏
分享
MinJerous:虽然我一直说 计算机不怎么卡学历 但是至少得一本
点赞 评论 收藏
分享
评论
2
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务