线程安全的队列ConcurrentLinkedQueue

  实现线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。

1.阻塞算法的队列可以使用锁的方式来实现。

2.非阻塞的实现方法则可以使用循环CAS的方式来实现。

       ConcurrentLickedQueue使用非阻塞的方式实现线程安全队列。是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。

      ConcurrentLinkedQueue由head节点和tail节点组成,每个节点(Node)由节点元素和指向下一个节点(next)的引用组成,节点与节点都是通过next关联起来,从而组成一张链表结构的队列。

入队列:

入队列主要做两件事: 1.定位出尾节点 2.使用CAS算法将入队列节点设置成尾节点的next节点

定位尾节点: tail节点并不是尾节点,所以每次入队都必须先通过tail节点来找到尾节点。尾节点可能是tail节点,也可能是tail节点的next节点。

设置入队节点为尾节点: p.casNext(null,n)方法用于将入队节点设置为当前队列尾节点的next节点。如果p是null,表示p是当前队列的尾部节点,如果不为null,表示有其他更新了尾节点,则需要重新获取当前队列的尾部节点。

 

出队列:

      出队列就是从队列里返回一个节点元素,并清空该节点对元素的引用。并不是每次出队列都更新head节点,当head节点里有元素的时候,直接弹出head节点里的数据,而不会更新head节点。只有当head节点里没有元素时,出队操作才会更新head节点。

       首先获取头节点的元素,然后判断头结点元素是否为空,如果为空,表示另外一个线程已经进行了一次出队操作将节点的元素取走,如果不为空,则使用CAS的方式将头结点的引用设置为null,如果CAS成功,则直接返回头结点的元素,如果不成功,表示另外一个线程已经进行了一次出队操作更新了head节点,导致元素发生了变化,需要重新获取头部节点。

    

 

 

 

 

 

转载于:https://my.oschina.net/u/3126880/blog/1832944

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值