ConCurrentHashMap采用锁分段技术提高了并发访问效率。它由segment数组和HashEntry数组组成。segment是采用了可重入锁,在map里扮演锁的角色;HashEntry则存储键值对数据。存储结构图如下:
2)、定位HashEntry:直接使用在hash值与(HashEntry数组-1)进行相与。
3)、get操作不加锁,可以并发无限制读。
4)、get取到的值是弱一致性的。可以取到更新完毕的值,但更新过程中的值可以取不到。
put操作:1)、判断是否需要对Segment里的HashEntry数组进行扩容。判断依据是threshold*负载因=容量。如果不扩容找到位置进行存储。2)、扩容为原来的两倍。
3)、写操作有锁,线程可以并发访问Map、并且一定数量(默认是使用16个锁)的写线程也可以并发修改Map。
size统计:先尝试2次通过不锁定segement方式来统计各个segement大小,如果统计中容器count发生了变化,则再采用加锁来统计。使用modCount变量来判断是否发生了变化,通过比较前后值得变化来判断是否进行了修改,因为每次修改modcount进行自动加1。
迭代:1)、ConcurrentHashMap提供的迭代器不会抛出ConcurrentModificationExeption,而且具有弱一致性,它可以容忍并发的修改。当创建迭代器时会遍历已有的元素,并可以(但是不保证)在迭代器被构造后将修改操作反映给容器。即遍历位置过的地方修改的数据不会显现,未遍历过位置的地方更新数据会立即显现。