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的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可以指向自身,也可以不指向自身。

猜你喜欢

转载自www.cnblogs.com/txmfz/p/10902096.html