为什么要使用ConcurrentHashMap?
在多线程环境下,会用HashMap进行put操作会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点用不为空,就会产生死循环获取Entry。
HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态。如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法来获取元素,所以竞争越激烈效率越低。
ConcurrentHashMap分析
Hash是一种散列,数据结构是以数组+链表的结构组成,输入元素通过固定算法分配到相应链表上,在ConcurrentHashMap中使用的是wang/jenkins算法分配元素。
JDK1.7下的实现
在JDK1.7中使用的是分段锁的设计思想。该思想是由Segment数据结构额和HashEntry数据结构组成。Segment实际是一种可重入锁(ReentrantLock),HashEntry则用于存储键值对数据。