在上篇文章中,我们深入解析了HashMap的底层原理,并指出HashMap是非线程安全的。在多线程环境下,我们通常会使用线程安全的 ConcurrentHashMap
或 Hashtable
。然而,Hashtable
逐渐被淘汰,而 ConcurrentHashMap
成为了主流选择。那么,Hashtable
为什么会被淘汰?它和 ConcurrentHashMap
之间存在哪些关键区别?本文将围绕这些高频问题展开。
ConcurrentHashMap和hashtable都是线程安全的,他们的区别主要体现在实现线程安全的机制有所不同。
文章目录
1. Hashtable 的线程安全机制
Hashtable
通过 synchronized 关键字对所有方法进行加锁,从而保证线程安全。例如,get()
和 put()
方法都被 synchronized
修饰:
public synchronized V get(Object key) {
Entry<?,?> tab[] = table;
int hash = key.hashCode();
for (Entry<?,?> e = tab[(hash & 0x7FFFFFFF) % tab.length];
e != null; e = e.next