Java同步数据结构之ConcurrentLinkedQueue
Posted txmfz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java同步数据结构之ConcurrentLinkedQueue相关的知识,希望对你有一定的参考价值。
前言
前面介绍的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的head与tail节点,有如下一些特性:
不变性 | 可变性 | |
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的主要内容,如果未能解决你的问题,请参考以下文章
Java同步数据结构之LinkedBlockingQueue