HashMap的缺点:
- 当多线程环境下,使用HashMap进行put操作的时候可能会出现死循环;导致CPU利用率接近100%。不过jdk1.8采用了尾插法解决了这个问题;但是会出现数据覆盖问题(主要是两个线程同时调用put方法,而且hash&(length-1)是同一桶位,两个线程同时put就可能造成只有一个线程成功,造成数据覆盖问题)
HashTable的缺点:
- HashTable在HashMap的基础上使用synchronized关键字加锁,虽然保证了并发的安全,但是相当于串行执行,并且如果线程竞争很激烈的话,一个线程访问同步方法,其他线程就要进行自旋或者阻塞,效率很低。
这个时候就需要线程安全并且效率较高的HashMap:ConcurrentHashMap
JDK1.7ConcurrentHashMap实现:
jdk1.7的ConcurrentHashMap主要是由segment和散列表两个对象维护的;在散列表中放的是Segment对象,而Segment对象其实相当于内部维护的是一个HashMap。在put的时候先找到要放到哪个桶位(Segment对象),然后尝试加锁,在调用Segment里面的put方法往Segment对象里面的HashMap存放。扩容的时候也是只扩容Segment对象里面的HashMap,与其他桶位无关
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。
- Segment是一种可重入锁ReentrantLock
- HashEntry则用于存储键值对数据
*Segm