Java并发:HashMap和ConcurrentHashMap的“get(Key)”性能相同吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java并发:HashMap和ConcurrentHashMap的“get(Key)”性能相同吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1794字,纯文字阅读大概需要3分钟。
内容图文
![Java并发:HashMap和ConcurrentHashMap的“get(Key)”性能相同吗?](/upload/InfoBanner/zyjiaocheng/802/f1a54aca73fa47fbb1ee13c2fac86673.jpg)
当没有对底层Map进行修改时,get(Key)方法调用标准HashMap和ConcurrentHashMap的性能相同(因此只执行get()操作.)
使用背景更新:
并发性是一个非常复杂的话题:我确实“并发/线程安全”,但只有看跌期权,这种情况极少发生.对于看跌期权我可以交换地图关联本身(原子和线程安全).因此,我要求我做了很多获取(并且可以选择使用HashMap(创建临时Hashmap,将数据复制到新的HashMap和交换关联)或使用ConcurrentHashMap实现它…作为我的应用程序真的我想了解更多关于性能如何随着不同的获取而丢失.这听起来很愚蠢,互联网上有太多不必要的信息,但我觉得这可能会引起更多人的兴趣.所以,如果有人知道ConcurrentHashMap的内部工作原理,那么回答这个问题会很棒.
非常感谢!
解决方法:
你可以查看源代码. (我正在看JDK 6)HashMap.get()非常简单:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
其中hash()执行一些额外的移位和XORing以“改进”您的哈希码.
ConcurrentHashMap.get()有点复杂,但不是很多
public V get(Object key) {
int hash = hash(key.hashCode());
return segmentFor(hash).get(key, hash);
}
同样,hash()做了一些移位和异或. setMentFor(int hash)执行简单的数组查找.唯一复杂的东西是在Segment.get()中.但即使这看起来不像火箭科学:
V get(Object key, int hash) {
if (count != 0) { // read-volatile
HashEntry<K,V> e = getFirst(hash);
while (e != null) {
if (e.hash == hash && key.equals(e.key)) {
V v = e.value;
if (v != null)
return v;
return readValueUnderLock(e); // recheck
}
e = e.next;
}
}
return null;
}
获取锁定的一个地方是readValueUnderLock().评论说,这在内存模型下在技术上是合法的,但从未发生过.
总的来说,看起来两者的代码非常相似.在ConcurrentHashMap中组织得更好一些.所以我猜测性能足够相似.
也就是说,如果看跌非常罕见,您可以考虑实施“写入时复制”类型的机制.
内容总结
以上是互联网集市为您收集整理的Java并发:HashMap和ConcurrentHashMap的“get(Key)”性能相同吗?全部内容,希望文章能够帮你解决Java并发:HashMap和ConcurrentHashMap的“get(Key)”性能相同吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。