并发举措八之并发集合

        前言:

        本文并不会对Java并发集合详细介绍,本文的目的在与大家需要意识到并发集合也是解决并发的措施之一


    一、 ConcurrentHashMap

       CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构

      

        concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是16,也就是说ConcurrentHashMap 有16 个Segments,所以理论上,这个时候,最多可以同时支持16 个线程并发写,只要它们的操作分别分布在不同的Segment 上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个Segment 内部,其实每个Segment 很像之前介绍的HashMap,不过它要保证线程安全,所以处理起来要麻烦些。

        Java8 对ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。

         

         对ConcurrentHashMap想深入了解,请阅https://www.jianshu.com/p/865c813f2726

 

 二、ConcurrentLinkedQueue

 

  •         基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现
  •         不变性

              在入队的最后一个元素的next为null
              队列中所有未删除的节点的item都不能为null且都能从head节点遍历到
              对于要删除的节点,不是直接将其设置为null,而是先将其item域设置为null(迭代器会跳过item为null的节点)
              允许head和tail更新滞后。这是什么意思呢?意思就说是head、tail不总是指向第一个元素和最后一个元素(后面阐述)

  •      精妙之处:利用CAS来完成数据操作,同时允许队列的不一致性,弱一致性表现淋漓尽致

 对ConcurrentLinkedQueue想深入了解,请阅 https://www.jianshu.com/p/231caf90f30b


    三、ConcurrentSkipListMap

 

  •   第三种key-value数据结构:SkipList(跳表)
  •   SkipList
  1. 平衡二叉树结构
  2. Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率特性
  3.  特性:

                由很多层结构组成,level是通过一定的概率随机产生的
                每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
                最底层(Level 1)的链表包含所有元素
                如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出
                每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素

 对ConcurrentSkipListMap想深入了解,请阅 https://segmentfault.com/a/1190000016168566
 


    四、ConcurrentSkipListSet


        内部采用ConcurrentSkipListMap实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值