上回我们在学习HashMap原理的时候遗留了一个问题,即HashMap是非线程安全的,那么如何来解决HashMap的线程安全问题呢,此时Hashtable就诞生了,今天我就来看下Hashtable是如何解决HashMap的线程安全的,请看源码:
public synchronized V put(K key, V value) {
//插入value值不能为null
if (value == null) {
throw new NullPointerException();
}
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
addEntry(hash, key, value, index);
return null;
}
看到synchronized这个关键字了吗?原来如此,其实啊Hashtable的主要方法的源码实现逻辑,与HashMap中大体相似,区别在于所有的操作都是通过锁来保护的(具体方法可以自己去看下源码,很简单)。只有获得了对应的锁,才能进行后续的读写等操作。但是大家想一想,这个机制虽然解决的线程安全的问题,但是又引发了另外个问题,所有的操作都是串行的,这大大的降低了并发效率,那么为了解决这个问题,咋们的jdk又发明个类叫ConcurrentHashMap,那么具体是如何提高并发性能的呢?敬请关注《Java集合Map之ConcurrentHashMap原理》。