标签:插入 之间 mic 线程安全 不可 分段 自治区 没有 数组下标
ConcurrentHashMap与HashMap的实现方法类似,不同的是它采用的是分段锁的思想支持并发的操作,它是线程安全的。
要了解ConcurrentHashMap,首先要了解Segment,一个Segment就相当于一个HashMap对象。与HashMap一样,Segment包含一个HashEntry数组,数组中的每个HashEntry既是一个键值对,也是一个链表的节点。在ConcurrentHashMap中,有2的N次方个Segment对象,他们共同保存在一个segments数组中。
整个ConcurrentHashMap的结构如下:
ConcurrentHashMap的并发读写的几种情况:
每一个Segment就像一个自治区,读写操作高度自治,Segment之间互不影响。不同的Segment的写入或者读是可以并发执行的,对于同一个Segment的一读一写也是可以并发执行的,但是同一Segment并发写入需要上锁,会被阻塞。都各自持有一把锁,ConcurrentHashMap当中每个Segment都各自持有一把锁,在保证线程安全的同时降低了锁的粒度,度高了并发度。
ConcurrentHashMap的读写过程:
ConcurrentHashMap在读写时都需要二次定位,首先定位到segment,之后定位到该segment的具体数组下标。
由于ConcurrentHashMap中对每一个Segment都各自加锁,保证了多线程下的数据安全,那么在调用Size()的时候,解决一致性也是一个问题,Size方法的目的是统计ConcurrentHashMap的总的元素个数,要将每一个Segment内部的元素的个数都统计得到总数;但是,如在在刚刚统计结束的Segment中瞬间插入一个新的元素,那又怎么解决?
其Size方法是一个嵌套循环。
为了尽量不锁住所有Segment,首先乐观地假设Size过程中不会有修改(CAS)。当尝试一定次数,才无奈转为悲观锁,锁住所有Segment保证强一致性。
标签:插入 之间 mic 线程安全 不可 分段 自治区 没有 数组下标
原文地址:https://www.cnblogs.com/128-cdy/p/12977411.html