ConcurrentHashMap相关知识点

1:为什么有这个东西

       我们在避免HashMap的线程安全问题有很多方法,比如Hashtable或者Collections.syschronizedMap,这两种方法有一个问题,性能问题,无论读操作还是写操作,他们会给整个集合加锁,导致同一时间的其他操作为之阻塞.
在并发环境下,为了兼顾线程安全和运行效率,这时候ConcurrentHashMap出生了

2:这个东西比hashMap多了哪些东西

ConcurrentHashMap的结构
ConcurrentHashMap相关知识点

3:这样设计的好处

      3.1:采用锁分段技术(分段锁,不是具体的某一种锁,而是一种锁的设计),每个segment好比一个自治区,读写高度自治,Segment之间互不影响,同一个segment可以并发的读写,但同一个segment并发写入需要加锁去阻塞,

4:ConCurrent具体的操作

4.1:get方法
      1:为输入的key做Hash运算,得到hash值,
      2:得到的hash值,定位到具体的segment上
      3:再次通过hash值,定义到Segment当中具体数组的位置
4.2:put方法
      定位到具体的Segment的时候.我们要获得重入锁
      插入完毕之后释放锁

5:Concurrent怎么调用Size方法统计ConcurrntHashMap总元素数量解决一致性的问题

(体现乐观锁和悲观锁,首先乐观的假设Size()方法统计统计的过程不会有修改,但当尝试一定的次数的时候,无奈转化为悲观锁,,锁住所有的Segment保证强一致性)
  5.1:遍历所有的Segment
  5.2:把Segment的元素数量加起来
  5.3:把Segment的修改的次数加起来
  5.4:判断所有的Segment的总修改次数是否大于上一次的总修改次数,大于,说明有修改,重新统计,尝试次数+1,
  5.4:尝试次数超过阀值,对每个segment对象加锁,重新统计
  5.5:判断修改次数是否和上一次的相同,我们已经加锁,次数一定和上一次的相同
  5.6:释放锁


补充:当链表长度达到八个的时候,会转化为红黑树


参考链接

https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653192083&idx=1&sn=5c4becd5724dd72ad489b9ed466329f5&chksm=8c990d49bbee845f69345e4121888ec967df27988bc66afd984a25331d2f6464a61dc0335a54&scene=21#wechat_redirect