• ConcurrentHashMap 简单心得


    探索 ConcurrentHashMap 高并发性的实现机制https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/
    上面的链接已经是比较老的jdk中的了,jdk1.7中代码已经和这个不一样了
     
    1.ConcurrentHashMap 类中包含这两个静态内部类 HashEntry 和 Segment。
         HashEntry 用来封装映射表的键 / 值对;
         Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。
         每个桶是由若干个 HashEntry 对象链接起来的链表。
         一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。
     
    2.相比较于 HashTable 和由同步包装器包装的 HashMap每次只能有一个线程执行读或写操作,ConcurrentHashMap 在并发访问性能上有了质的提高。在理想状态下,(默认情况配置)ConcurrentHashMap 可以支持 16 个线程执行并发写操作(如果并发级别设置为 16),及任意数量线程的读操作。
     
     
    HashMap结构示意图:
     
     
     
     
    1.put
    1. 对segment加锁
    2. 通过hash值计算出要插入的insert key值应该在的segment
    3. 根据hash找到inserkey对应的bucket
    4. 首先会先遍历bucket的链表,寻找bucket中是否有相同的key
    5. 如果能找到则直接更新oldvalue
    6. 如果对应的bucket不存在则创建bucket,把insert key插入到第一个位置
    7. 如果bucket存在,insert key在bucket中不存在,还是把insert key插入到第一个位置
     
    2.remove
    • 对segment加锁
    • 找到要删除的key所在的bucket位置
    • 遍历链表找到key在链表中的位置
    • 用pred纪录便利过记录中最新的一条,也就是用来保存deletekey前面一条记录
    • 删除操作具体是用pred->next = e.next
     
     
    在执行 remove 操作时,原始链表并没有被修改,也就是说:读线程不会受同时执行 remove 操作的并发写线程的干扰。
  • 相关阅读:
    翻转数组
    C语言之指针
    C语言之结构体
    C语言之函数
    数据结构之typedef
    数据结构之树
    数据结构之链表
    数据结构之队列
    数据结构之数组
    ssh远程连接控制 linux 口令、密钥连接
  • 原文地址:https://www.cnblogs.com/kniught-ice/p/5248119.html
Copyright © 2020-2023  润新知