高效读写的队列:深度剖析ConcurrentLinkedQueue

本文详细探讨了ConcurrentLinkedQueue的内部实现,包括其线程安全的链表节点操作,以及如何通过CAS操作和算法确保高效读写。在队列为空时添加元素的流程被详细阐述,同时解释了当遇到哨兵节点时如何处理并发问题,避免了重新查找尾部的开销。
摘要由CSDN通过智能技术生成

队列、链表之类的数据结构及其常用。Java中,ArrayList和Vector都是使用数组作为其内部实现。两者最大的不同在于:Vector是线程安全的,而ArrayList不是。此外LinkedList使用链表的数据结构实现了List,但并不是线程安全的,就像之前包装HashMap,这里我们可以使用Collections.synchronizedList()来包装任意List。此时,生成的List对象就是线程安全的。

public static List<String> l = Collections.synchronizedList(new LinkedList<String>());

高效读写的队列:深度剖析ConcurrentLinkedQueue

 JDK中,提供了一个ConcurrentLinkedQueue类来实现高并发的队列。这个队列使用链表作为其数据结构。这个类算是高并发环境中性能最好的队列。高性能是因为其内部复杂的实现。

链表内的节点:

    private static class Node<E> {
   
        volatile E item;
        volatile Node<E> next;
    ...

其实这是一个静态内部类,item是来表示元素的。next表示当前Node的下一个元素。
对Node进行操作时,使用了CAS操作:

//表示设置当前Node的item值。第一个参数为期望值,第二个参数为设置目标值。当当前值等于期望值时(就是没有被其他人改过),就会将目标设置为val。
boolean casItem(E cmp, E val) {
    return UNSAFE.compar
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值