CLQ小结

     好久没写文章,小结ConcurrentLinkedQueue做个临时记录,它虽然强大但也有它的问题,网上介绍集合中cas操作的文章很多,这里只写一下个人理解

(1)size方法很慢(与ConcurrentHashMap相似)

(2)remove方法很慢(与大部分Queue相似)

(3)如果remove最后一个节点中的元素,remove后节点不会删除

(4)同理当新增完一个元素之后马上删除,这个节点依然存在,所以要尽量避免这种情况的出现:
offer(a)、remove(a) ;offer(b)、remove(b)

(5)使用迭代器中的删除方法也不会移除节点

(6)迭代器的遍历过程中会移除空节点

(7)poll、peek、contains、size、toArray等方法也会移除空节点,但只移除从第一个空节点到第一个有元素节点之间的空节点

通过cas实现无锁队列有他的代价,个人建议使用ConcurrentLinkedQueue慎用remove方法,不但慢而且内存处理这块与其他Queue并不一样,稍有不慎会有大量废弃节点存在,造成某些时刻的内存泄露,最合适它的场景是只有offer与poll的存在,类似命令模式、task的执行

你可能感兴趣的:(小结)