ConcurrentHashMap 的 get 方法会出现存在但get返回 null 的情况嘛?(Java 8 及之后版本)
假如 ConcurrentHashMap 正在扩容,而有一个线程调用了 get() 方法,当 get() 方法在链表中遍历查找时,链表为 a1 -> a2 -> b1 -> b2 -> a3。
假设我们要查找的为 a3, 此时遍历到 b1 时, 扩容导致 b1 -> b2 移到了新的位置,a1 -> a2 -> a3 留在了原位置,那么此 get() 方法会返回 null嘛? 但原本 hashMap 中是存在 a3 的。
您好,不会的。HashMap的resize是copy&move,即它会复制当前的元素并移动到新的桶列表中,再将扩容完成的桶列表替换掉当前的桶列表。因此你取到的是某一刻桶列表的快照,而resize并不会影响这个快照,而modify操作如put/remove则有可能会改变它。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。