ConcurrentXxxXxx

本文详细介绍了ConcurrentLinkedQueue的实现原理及其不变性,深入解析了ConcurrentSkipListMap与ConcurrentSkipListSet的数据结构及工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/leesf456/p/5539142.html
              http://blog.csdn.net/chenssy/article/details/74853120

       ConcurerntLinkedQueue是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列的头部是队列中时间最长的元素,队列的尾部是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue是一个恰当的选择。此队列不允许使用null元素。
       CoucurrentLinkedQueue规定了如下几个不变性:
          1.在入队的最后一个元素的next为null;
          2.队列中所有未删除的节点的item都不能为null且都能从head节点遍历到;
          3.对于要删除的节点,不是直接将其设置为null,而是先将其item域设置为null(迭代器会跳过item为null的节点);
          4.允许head和tail更新滞后。意思就是说head、tail不总是指向第一个元素和最后一个元素。
       head节点不能为null,所有未删除的节点都可以通过head节点遍历到,head节点的next不能指向自身,head的item可能为null,也可能不为null,并且允许tail滞后head,即head不可达tail。
       tail节点也tail不能为null,tail的item可能为null,也可能不为null,tail节点的next域可以指向自身,允许tail滞后head。


       ConcurrentSkipListMap其内部采用SkipList数据结构实现,关于SkipList的介绍可以看下http://blog.csdn.net/chenssy/article/details/75000701
       为了实现SkipList,ConcurrentSkipListMap提供了三个内部类来构建这样的链表结构:Node、Index、HeadIndex。其中Node表示最底层的单链表有序节点、Index表示为基于Node的索引层,HeadIndex用来维护索引层次。
       ConcurrentSkipListMap是通过HeadIndex维护索引层次,通过Index从最上层开始往下层查找,一步一步缩小查询范围,最后到达最底层Node时,就只需要比较很小一部分数据了。其数据结构如下图:
       
 

       ConcurrentSkipListSet是基于ConcurrentSkipListMap实现的,ConcurrentSkipListSet将所有键所对应的值value均置为Boolean.TRUE,所以数据结构与ConcurrentSkipListMap完全相同,并且对ConcurrentSkipListSet的操作都会转化为对ConcurrentSkipListMap的操作。
       ConcurrentSkipListSet迭代器是弱一致性的,即在迭代的过程中,可以有其他修改ConcurrentSkipListSet的操作,不会抛出ConcurrentModificationException异常。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值