2016-09-26 43 views
0
/** 
* Removes all of the elements from this deque. 
*/ 
public void clear() { 
    while (pollFirst() != null) 
     ; 
} 

當前實現只是逐個彈出隊列中的元素,但是可以通過將頭尾指針項重置爲空隊列來完成? 這裏需要注意什麼?是否可以將ConcurrentLinkedDeque清除爲重置頭尾指針?

+0

一般而言,您不希望未使用的對象引用保留未使用的對象被垃圾收集。可能pollFirst做了一些調整。重新設定頭部和尾部 - 雖然非常有吸引力 - 也必須保護。 –

回答

0

pollFirst()方法做的不僅僅是從隊列中彈出項目。它以線程安全的方式執行。

public E pollFirst() { 
    for (Node<E> p = first(); p != null; p = succ(p)) { 
     E item = p.item; 
     if (item != null && p.casItem(item, null)) { 
      unlink(p); 
      return item; 
     } 
    } 
    return null; 
} 

既然你要保持你的併發收集並​​發,一個辦法是確保你使用已經併發操作,如pollFirst()

同樣值得注意的是,clear()作爲一種操作與其他人相比「不那麼重要」,所以即使可能以不同的方式實施它,這樣做也沒什麼用處。

+0

好吧,考慮到純粹爲了理論目的,是否可以重新設置指針並讓事情正確? – zinking

+0

我非常懷疑。出於某種原因,它們是非常先進的數據結構。 – Kayaman