码迷,mamicode.com
首页 > 编程语言 > 详细

Java同步数据结构之ConcurrentLinkedQueue

时间:2019-05-21 21:09:44      阅读:432      评论:0      收藏:0      [点我收藏+]

标签:安全   就是   线程   style   不为   本质   链表实现   lin   集合   

前言

前面介绍的Queue都是通过Lock锁实现的阻塞队列,今天介绍一种非阻塞队列ConcurrentLinkedQueue,所谓非阻塞,其实就是通过CAS代替加锁来实现的高效的非阻塞队列。当许多线程共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择。与大多数其他并发集合实现一样,该类不允许使用空元素。

ConcurrentLinkedQueue是一个基于链表的无界线程安全的先进先出队列。虽然前面介绍的队列也有基于链表的实现,例如LinkedBlockingQueue以及SynchronousQueue的公平队列实现,但是ConcurrentLinkedQueue的链表实现与它们有本质的差别,LinkedBlockingQueue的链表实现存在一个虚拟head节点,以及始终指向队列最后一个节点的tail节点,但是ConcurrentLinkedQueue的head与tail则更加灵活多变,ConcurrentLinkedQueue有如下一些基本约束特性

1.CAS入队的最后一个节点的next指向为null。
2.队列中的所有未删除节点是那些item不为null,并且都能从head节点访问到的节点,因为删除节点是通过CAS将其item引用置为null。迭代器会跳过那些item为null的节点。
3.head并不总是指向队列的第一个元素,tail也并不总是指向队列的最后一个节点。

针对ConcurrentLinkedQueue的headtail节点,有如下一些特性:

  不变性 可变性
head

1.所有未删除的节点都可以从head节点通过succ()方法访问到

2.head不会为null

3.head节点的next不会指向自身

1.head的item可能为null,也可能不为null

2.允许tail滞后于head,即允许从head通过succ()不能访问到tail。

tail

1.最后一个节点总是可以从tail通过succ()方法访问到

2.tail不会为null

1.tail的item可能为null,也可能不为null

2.允许tail滞后于head,即允许从head通过succ()不能访问到tail。

3.tail节点的next可以指向自身,也可以不指向自身。

Java同步数据结构之ConcurrentLinkedQueue

标签:安全   就是   线程   style   不为   本质   链表实现   lin   集合   

原文地址:https://www.cnblogs.com/txmfz/p/10902096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!