因为HashMap只能在单线程下保证安全性,HashTable在多线程下可以很安全,但是速度慢,所以使用ConcurrentHashMap,又快,又安全。实在不行,可以去看一下 https://blog.csdn.net/l_h_y123/article/details/53330763 这篇博客,从实战出发,为什么使用ConcurrentHashMap?
单一去理解ConcurrentHashMap不够形象,我们和HashTable来对比一下。 学过Java的应该知道可以通过Synchronized关键字来实现线程安全。Hashtable 就是对整张表加锁来实现线程安全,这样的缺点就是使程序的效率变得很低。这也是在Java中会在1.5后引入ConcurrentHashMap的原因。 ConcurrentHashMap把锁加在每一个segment上,这样对segment1操作时,同时也可以对segment2操作,这样的效率就会高很多。这就是ConcurrentHashMap为什么又快又安全的原因。
答案是不能。 首先,我们知道ConcurrentHashMap与HashTable都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降。因为ConcurrentHashMap引入了分割的理念(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等其他操作完成才能访问map。这是concurrentHashMap相比较于HashTable的优点。 但是,使用ConcurrentHashMap的时候,涉及到一个强一致性和弱一致性的问题。 强一致性和弱一致性的通俗理解是: 当你进行某一个操作的时候,操作的结果会马上有效,那么就是强一致性,如果要有一段时间的间隔,那么就叫做弱一致性。 而ConcurrentHashMap的get,clear,iterator 都是弱一致性的,而HashTable是强一致性的。举一个例子:当你期望往ConcurrentHashMap底层数据结构中加入一个元素后,立马能对get可见,但ConcurrentHashMap并不能如你所愿。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素,这就很麻烦了。这也是前者不能完全取代后者的原因。