ConcurrentXxxXxx
来源:互联网 发布:阿里云空间多少钱一年 编辑:程序博客网 时间:2024/06/16 08:03
转载自: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时,就只需要比较很小一部分数据了。其数据结构如下图:
![](http://images2015.cnblogs.com/blog/616953/201605/616953-20160525211305834-107723829.png)
ConcurrentSkipListSet是基于ConcurrentSkipListMap实现的,ConcurrentSkipListSet将所有键所对应的值value均置为Boolean.TRUE,所以数据结构与ConcurrentSkipListMap完全相同,并且对ConcurrentSkipListSet的操作都会转化为对ConcurrentSkipListMap的操作。
ConcurrentSkipListSet迭代器是弱一致性的,即在迭代的过程中,可以有其他修改ConcurrentSkipListSet的操作,不会抛出ConcurrentModificationException异常。
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时,就只需要比较很小一部分数据了。其数据结构如下图:
![](http://images2015.cnblogs.com/blog/616953/201605/616953-20160525211305834-107723829.png)
ConcurrentSkipListSet是基于ConcurrentSkipListMap实现的,ConcurrentSkipListSet将所有键所对应的值value均置为Boolean.TRUE,所以数据结构与ConcurrentSkipListMap完全相同,并且对ConcurrentSkipListSet的操作都会转化为对ConcurrentSkipListMap的操作。
ConcurrentSkipListSet迭代器是弱一致性的,即在迭代的过程中,可以有其他修改ConcurrentSkipListSet的操作,不会抛出ConcurrentModificationException异常。