为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?
1. Hashtable 的性能问题
Hashtable 是 Java 中的一个老旧集合类,它的性能较慢主要有以下几个原因:
-
全局锁:Hashtable 的所有操作(如
put()
、get()
)都使用同步机制,即整个对象的全局锁。这意味着在同一时刻,只有一个线程能够执行任何操作,这在多线程环境中会极大地限制并发性,导致性能瓶颈。 -
较少的并发性:由于全局锁的存在,虽然多线程可以访问
Hashtable
的方法,但在对集合进行操作时,锁的竞争会导致大量的上下文切换和线程阻塞,从而降低整体性能。 -
扩容时的性能下降:在扩容时,Hashtable 会锁住整个表,导致其他线程无法继续执行。扩容后,还需要重新计算数据位置,这增加了性能开销。
2. ConcurrentHashMap 的并发度
ConcurrentHashMap 是 Java 5 引入的一个更高效的并发集合类,设计初衷是为了解决 Hashtable 的并发性能问题。
-
分段锁:ConcurrentHashMap 使用了分段锁(Segment Locking)的机制。在较新的实现中(Java 8 及以上),它使用了更细粒度的锁(或锁分离技术),即每个桶(bucket)可以独立使用锁。这样就允许多个线程同时访问不同的桶,从而提高并发性能。
-
并发度:ConcurrentHashMap 的默认并发级别是 16,表示它将内部结构分为 16 个部分(segments),在这个例子中,最多可以同时有 16 个线程进行读写操作(取决于实现及负载)。如果创建时使用构造函数,可以自定义并发级别。
-
性能优势:在多线程环境下,ConcurrentHashMap 的读取和写入性能都比 Hashtable 显著更高。同时,它还支持非阻塞的读操作,这使得在读多写少的场景中表现优秀。
总结
- Hashtable 性能慢的原因在于全局锁、低并发性和扩容时的性能开销。
- ConcurrentHashMap 通过引入分段锁和更细粒度的锁机制提高了并发性能,其默认并发度是 16,能够显著改善多线程环境下的执行效率。
如果您有更多问题或者需要进一步的探讨,请随时问我!