2014-12-22 28 views
2

我是Java和stackoverflow的新手,并且正在从Collections Framework开发人员的经验丰富的人员寻求答案。ConcurrentHashMap和哈希表的区别

我读到hashTable是线程安全的,concurrentHashMap也是如此,但concurrentHashMap比hashTable快,因为它将地图段锁定到访问线程。

这是如何在内部工作的?细分市场的规模如何决定?示例:如果concurrentHashMap中有40个条目,并且有3个线程试图检索/修改数据,那么将如何确定这些分段?

任何图像/解释/代码在这将真的很棒。提前致谢。

+0

基本上ConcurrentHashMap具有更好的性能,因为使用CAS操作实现而不是锁定会导致许多上下文切换和等待。 – Maxim

+0

这是一篇关于ConcurrentHashMap的优秀文章:http://www.burnison.ca/articles/the-concurrency-of-concurrenthashmap –

+0

谢谢,这真的有帮助。不知道为什么它被标记为重复,因为另一个问题是“HashMap和HashTable之间的区别” – Kay

回答

-1

concurrentHashMap - 锁定自由算法。读或写操作之间没有同步。 作为每Java文档

的哈希表支持更新检索的完全并发和可调 预期的并发性。该类遵循与Hashtable相同的功能 规范,并且包括与Hashtable的每种方法对应的方法 的版本。但是,即使所有 操作都是线程安全的,但检索操作不会导致锁定,并且也不支持以防止所有访问的方式锁定整个表的 。这个类与 Hashtable在依赖其线程安全性的程序中完全可互操作,但不依赖其 同步细节。

HashTable - 一切都是同步的。它在读和写操作之间完全同步

+0

谢谢Siva。 “检索操作不需要锁定”,这意味着写操作会锁定段? “没有任何支持以阻止所有访问的方式锁定整个表”这一行表明某些部分被锁定,但不是整个表。你能否解释一下,如果在任何时候通过表/段上的线程获得锁? – Kay

+1

ConcurrentHashMap' * not * lock-free。 –

+0

Steven是对的,CHM肯定不是***无锁。 ConcurrentLinkedQueue是无锁的,但CHM使用分段锁。 –