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

时间:2013-12-25 05:13:30

标签: concurrency queue

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html#remove(java.lang.Object)

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

1 个答案:

答案 0 :(得分:1)

我认为查看ConcurrentLinkedQueue的source code可以给出明确的答案。

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;
}

正如您所看到的,在找到删除节点之前,会通过队列节点进行迭代并检查每个节点。有了这个,我们可以说删除性能线性地依赖于队列大小。因此,与enqueue和dequeue相比, ConcurrentLinkedQueue remove(Object)方法没有恒定的时间性能,但依赖于队列大小。