ConCurrentHashMap

ConCurrentHashMap

避免hashMap的线程安全问题,可以选择hashTable或者SychronizedMap,但是这些集合为了线程安全,在进入put,get的时候都会加上锁,太影响效率了

为了兼顾安全以及效率,这个时候ConcurrentHashMap就应运而生

把hashMap分为多个segment,给每个segment加上锁,只有当对一个segment进行写操作的时候会加锁

concurrentHashMap的读写操作

get(“key”),先hash定位到相应的segment,然后再次hash定位到segment当中数组的具体位置

put(key,value):首先hash定位到相应的segment,然后获得可重入锁,再次hash找到相应的位置,put值,释放锁

concurrent的size方法

遍历这个segment的所有元素的个数

然后统计所有segment的修改次数加起来

判断修改次数是否大于上次的总的修改次数,如果大于,说明统计过程中出现了新增,或者删除,重新统计,如果没有,说明统计过程中没有出现修改,统计结束

如果统计次数草果阈值,给每个segment加锁,在统计一次,然后释放锁

基本思想与乐观锁,悲观锁相似:默认统计过程中不出现新增或者删除,尝试一定次数之后,才转换为悲观锁,将所有segment加上锁,保证强一致性

 

原文地址:https://www.cnblogs.com/zhangchiblog/p/8413716.html