ConcurrentLinkedQueue学习的一点感悟

简介:ConcurrentLinkedQueue是一种队列数据结构,数据是FIFO(first input first out)的, 内部采用CAS实现高并发读写安全,而木有采用锁的机制。
记录下学习过程。
这个类两个最重要的属性:
private transient volatile Node<E> head;//队列里面的头
private transient volatile Node<E> tail;//队列的尾

head和 tail 在 ConcurrentLinkedQueue 初始化的时候都会指向同一个Node<Item> 节点,其中 Node 为ConcurrentLinkedQueue 静态内部类。

public ConcurrentLinkedQueue() {
head = tail = new Node<E>(null);①
}

Node 有这两个属性
volatile E item;//当前节点存储的对象
volatile Node<E> next;//指向下一个Node的引用,通过这引用才可以形成链表结构。

offer(E e) //数据进入队列
在未插入数据之前,head和tail 都指向 一个 Node<E> item为空,next 也为null.
贴上代码(JDK1.8):
下面说明下对象刚创建,到第一个数据插入的过程
checkNotNull(e);//检查插入的数据是否为null
final Node<E> newNode = new Node<E>(e);//将插入的数据注入创建的节点类。
for (Node<E> t = tail, p = t;;)//这个是很经典的CAS操作。死循环,直到操作成功return true退出;
Node<E> q = p.next;//新建了两个变量 p,t 都是指向末尾节点,就是指向刚开始创建的那个Node(①位置那个), q节点指向初始化节点的next,这里肯定是空了。
if (q == null) {//进入
if (p.casNext(null, newNode)) { //CAS操作.这个方法的功能是 如果p的成员属性为null,就把它设置为newNode

---未完

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容