Concurrency java ConcurrentLinkedQueue是否具有用于删除的固定时间性能?

Concurrency java ConcurrentLinkedQueue是否具有用于删除的固定时间性能?,concurrency,queue,Concurrency,Queue,我知道这个数据结构对于入队和出队都有固定的时间性能,但是对于删除(对象o)它有固定的时间性能吗?我认为查看ConcurrentLinkedQueue的性能可以给出明确的答案 public boolean remove(Object o) { if (o == null) return false; Node<E> pred = null; for (Node<E> p = first(); p != null; p = succ(p)) {

我知道这个数据结构对于入队和出队都有固定的时间性能,但是对于删除(对象o)它有固定的时间性能吗?

我认为查看ConcurrentLinkedQueue的性能可以给出明确的答案

public boolean remove(Object o) {
    if (o == null) return false;
    Node<E> pred = null;
    for (Node<E> p = first(); p != null; p = succ(p)) {
        E item = p.item;
        if (item != null &&
            o.equals(item) &&
            p.casItem(item, null)) {
            Node<E> next = succ(p);
            if (pred != null && next != null)
                pred.casNext(p, next);
            return true;
        }
        pred = p;
    }
    return false;
}
公共布尔删除(对象o){
如果(o==null)返回false;
节点pred=null;
对于(节点p=first();p!=null;p=such(p)){
E项=p项;
如果(项!=null&&
o、 相等(项目)&&
p、 casItem(item,null)){
节点下一步=成功(p);
if(pred!=null&&next!=null)
pred.casNext(p,next);
返回true;
}
pred=p;
}
返回false;
}

如您所见,在找到删除节点之前,通过检查每个节点,可以对队列节点进行迭代。因此,我们可以说删除性能与队列大小成线性关系。因此,与排队和退队相比,ConcurrentLinkedQueue remove(Object)方法的时间性能并不是恒定的,而是取决于队列大小。

我想读一点书后,我会觉得说“不”是相当安全的。类文档声明它基于一系列链接节点。由于添加到已知节点,排队和出队时间是恒定的,但从任意位置删除可能与从链表中删除具有大致相同的运行时间:线性时间。有趣的是,size()也不是一个常数时间操作。。。说了这么多,我希望其他人也加入进来——这是基于我对文件的理解。@JTrana你说得对。下面是openjdk实现的示例-