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加上锁,保证强一致性