今天就跟大家聊聊有关java中怎么使用HashMap与ConcurrentHashMap实现高并发,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
HashMap底层就是一个数组,而数组的每一项都是一个链表,当我们新建一个HashMap时就会初始化一个数组。HashMap有两个参数影响性能,分别是初始容量和加载因子。
HashMap寻址方式:对于一个新插入的数据或者需要读取的数据,HashMap需要根据key按照一个计算规则计算出Hash值并对我们的数组长度进行取模,取模结果作为数组的index,而取模的代价远远高于位运算的代价,因此HashMap的数组长度必须是2的N次方,将计算出的Hash值和2的N-1次方进行“与”运算,结果与取模操作是相同的。
HashMap并不要求用户在指定HashMap容量时必须传入一个2的N次方的整数,而是在初始化时根据传入的容量值计算出一个满足2的N次方的容量。
总所周知HashMap不是一个线程安全的,主要体现在执行resize方法时可能会产生死循环,当HashMap的size超过他的容量*负载因子时,就需要对HashMap扩容,具体方法是创建一个新的原来容量的两倍的数组(保证新的容量仍然是2的N次方,从而保证上述的寻址方式仍然适用),同时把原来的数组重新插入到新的数组中,这一过程并不保证线程安全,而且在多线程并发调用时可能会产生死循环。
上面是单线程下reHash的扩容步骤。
在多线程情况下:
数据结构:
看完上述内容,你们对java中怎么使用HashMap与ConcurrentHashMap实现高并发有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。