ConcurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。Hashmap在多线程并发的情况下,是线程不安全的,容易出现死循环、死锁等问题,JDK8后不会出现死锁问题,但依然存在多线程的系列问题,如:数据丢失等。所以就有了ConcurrentHashMap 来解决了。
ConcurrentHashMap在JDK1.7是通过segment来对map进行分段(分为多个Segment),每个segment持有一把锁,在多线程并发访问的时候,每个线程对应一个segment,各segment之间操作互不影响。ConcurrentHashMap初始化segment的个数为16,也就等于支持16个线程同时操作,如果有大于16或更多线程同时访问,且都是put插入操作就需要等待释放锁后,才能继续操作,写与读是可以并发执行的。具体可参考下图说明:
ConcurrentHashMap集合中有2的N次方Segment对象,共同保存在一个名为 segments的数组当中。因此整个ConcurrentHashMap的结构如下: