/**
* Removes all of the elements from this deque.
*/
public void clear() {
while (pollFirst() != null)
;
}
當前實現只是逐個彈出隊列中的元素,但是可以通過將頭尾指針項重置爲空隊列來完成? 這裏需要注意什麼?是否可以將ConcurrentLinkedDeque清除爲重置頭尾指針?
/**
* Removes all of the elements from this deque.
*/
public void clear() {
while (pollFirst() != null)
;
}
當前實現只是逐個彈出隊列中的元素,但是可以通過將頭尾指針項重置爲空隊列來完成? 這裏需要注意什麼?是否可以將ConcurrentLinkedDeque清除爲重置頭尾指針?
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()
作爲一種操作與其他人相比「不那麼重要」,所以即使可能以不同的方式實施它,這樣做也沒什麼用處。
一般而言,您不希望未使用的對象引用保留未使用的對象被垃圾收集。可能pollFirst做了一些調整。重新設定頭部和尾部 - 雖然非常有吸引力 - 也必須保護。 –