ConcurrentSkipListMap 学习笔记

ConcurrentSkipListMap 学习笔记

标签(空格分隔): juc学习


基于跳跃表的线程安全的map集合。针对某一特殊需求而设计的——支持排序,同时支持搜索目标返回最接近匹配项的导航方法。

容器的主要功能:增删查

  1. findPredecessor(key)从左上角一直往右,往下,往右,往下查,直到查到有相同key或者null
  2. findNode(Object key)在查的时候直接或间接的帮忙删除节点。(像并查集,在查询的时候做删除操作,而删除动作简单)

  1. 根据给定的key从跳表的左上方往右或者往下查找到Node链表的前驱Node结点,这个查找过程会删除一些已经标记为删除的结点。

2.找到前驱结点后,开始往后插入查找插入的位置(因为找到前驱结点后,可能有另外一个线程在此前驱结点后插入了一个结点,所以步骤①得到的前驱现在可能不是要插入的结点的前驱,所以需要往后查找)。

  1. 随机生成一个种子,判断是否需要增加层级,并且在各层级中插入对应的Index结点。

  1. 根据key值找到前驱结点,查找的过程会删除一个标记为删除的结点。

  2. 从前驱结点往后查找该结点。

  3. 在该结点后面添加一个marker结点,若添加成功,则将该结点的前驱的后继设置为该结点之前的后继。

  4. 头结点的next域是否为空,若为空,则减少层级。

理解到的东西:
1、cas操作是根据Unsafe这个类,通过计算偏移量改写对象的属性值。
2、cas去实现并发,需要在代码每次都考虑是否被修改,代码可读性差。
3、for循环前可以加标志 xx,当多层循环嵌套时,可以break xx结束到最外层循环。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,712评论 0 16
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 6,904评论 0 3
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,351评论 0 13
  • 题目这句话,我想送给我的老板。 当初之所以来现在这家公司,除了薪资方面比较满意,还因为老板办公室挂的那块匾,匾上写...
    林白与蜗牛阅读 8,912评论 61 42
  • 秋的余绪还在空气里轻敲 一边却是棉袄的拥抱 那年,一地落地飘洒的雨忆 似乎,雨的名字,已不能拨动心跳 到底还是将过...
    谭爽爽阅读 1,280评论 0 0