Java中的ConcurrentHashMap和Hashtable
这个问题在这里已经有了答案:
ConcurrentHashMap
使用多个桶来存储数据。 这样可以避免读锁,并大大提高了HashTable
性能。 两者都是线程安全的,但ConcurrentHashMap
有明显的性能优势。
当您使用get()
从ConcurrentHashMap
读取数据时,没有锁定,与所有操作都简单同步的HashTable
相反。 HashTable
是在老版本的Java中发布的,而ConcurrentHashMap
是Java 5+的东西。
HashMap
是在单线程应用程序中使用的最佳选择。
ConcurrentHashMap和Hashtable锁定机制
Hashtable
属于Collection框架; ConcurrentHashMap
属于Executor框架。 Hashtable
对整个数据使用单个锁 。 ConcurrentHashMap
在段级别上使用多个锁定 (默认为16),而不是对象级别,即整个Map
。 ConcurrentHashMap
锁定仅适用于更新。 在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。 所以读取可以非常快速地进行,而写入则通过锁定来完成。 ConcurrentHashMap
不会抛出ConcurrentModificationException
异常。 ConcurrentHashMap
返回Iterator
,它在并发修改时失败 - 安全(即迭代器将复制内部数据结构)。 ConcurrentHashMap
使用数据库分片逻辑( Segment<K, V>[] segments
)称为并发级别 ,即将数据分成碎片(分段),而不是将每个分片放在一个分片上数据( Map
)。 默认值是16。 要更专业地了解ConcurrentHashMap,请查看此链接
下面的比喻可以帮助你理解这个概念(而不是逻辑)
Hashtable
和ConcurrentHashMap
是两种类型的家庭。 Hashtable
锁住了家门。 ConcurrentHashMap
锁定特定的房间门而不是大门。 对于线程应用程序哪个更高效?
ConcurrentHashMap
对于线程应用程序更有效。
上一篇: ConcurrentHashMap and Hashtable in Java
下一篇: Simplest and understandable example of volatile keyword in java