HashMap、hashTable、ConcurrentHashMap的区别

转自:https://blog.csdn.net/u013238512/article/details/79485304

HashMapHashTable的区别一种比较简单的回答是:

1HashMap非线程安全的,HashTable是线程安全的。

2HashMap的键和值都允许有null存在,而HashTable则都不行。

3)因为线程安全、哈希效率的问题,HashMap效率HashTable的要高

关于使用ConcurrentHashMap的理由:

众所周知,哈希表是中非常高效,复杂度为O(1)的数据结构,在Java开发中,我们最常见到最频繁使用的就是HashMap和HashTable,但是在线程竞争激烈的并发场景中使用都不够合理。

  HashMap :先说HashMap,HashMap是线程不安全的,在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析),导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的。

  HashTable : HashTable和HashMap的实现原理几乎一样,差别无非是

扫描二维码关注公众号,回复: 2218867 查看本文章

          1.HashTable不允许key和value为null;

          2.HashTable是线程安全的。

        但是HashTable线程安全的策略实现代价却太大了,简单粗暴,get/put所有相关操作都是synchronized的,这相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞,相当于将所有的操作串行化,在竞争激烈的并发场景中性能就会非常差。

HashTable性能差主要是由于所有操作需要竞争同一把锁,而如果容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不同段的数据时,就不会存在锁竞争了,这样便可以有效地提高并发效率。这就是ConcurrentHashMap所采用的"分段锁"思想。


ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来决定具体存放进哪个Segment,如果查看Segmentput操作,我们会发现内部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作保证同步的时候,锁住的不是整个MapHashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此HashTable已经被淘汰了



猜你喜欢

转载自blog.csdn.net/jlfan1205/article/details/81064354