Java中的ConcurrentHashMap和Hashtable
Java中的ConcurrentHashMap和Hashtable有什么不同?
哪个线程应用程序更高效?
ConcurrentHashMap
使用多个桶来存储数据。 这样可以避免读锁,并且大大提高了HashTable
性能。 两者都是线程安全的,但ConcurrentHashMap
有明显的性能优势。
当使用get()
从ConcurrentHashMap
读取数据时,没有locking,与所有操作都简单同步的HashTable
相反。 HashTable
在旧版本的Java中发布,而ConcurrentHashMap
是一个Java 5+的东西。
HashMap
是在单线程应用程序中使用的最好的东西。
ConcurrentHashMap和Hashtablelocking机制
-
Hashtable
属于Collection框架;ConcurrentHashMap
属于Executor框架。 -
Hashtable
对整个数据使用单个锁 。ConcurrentHashMap
在段级别上使用多个锁 (默认为16),而不是对象级(即整个Map
。 -
ConcurrentHashMap
locking仅适用于更新。 在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。 所以读取可以非常快地发生,而写入是通过locking完成的。 - 如果一个线程试图修改而另一个线程迭代它并且不允许空值,则
ConcurrentHashMap
不会抛出ConcurrentModificationException
exception。 -
ConcurrentHashMap
返回Iterator
,它在并发修改时失败(即迭代器将复制内部数据结构)。 -
ConcurrentHashMap
使用数据库分片逻辑(Segment<K, V>[] segments
)被称为并发级别 ,即将数据分成碎片(段)数据(Map
)。 默认值是16。
要更多地了解ConcurrentHashMap,请查看此链接
下面的比喻可以帮助你理解概念(而不是逻辑)
- 假设
Hashtable
和ConcurrentHashMap
是两种types的家庭。 -
Hashtable
锁住了家门。 -
ConcurrentHashMap
locking特定的房间门而不是大门。
哪个线程应用程序更高效?
ConcurrentHashMap
对于线程应用程序更高效。