簡體   English   中英

無法理解此有關快速失敗的評論

[英]Cannot understand this comment about fail-fast

在JDK 1.6的HashSet.java中,有一些關於HashSet迭代器的fail-fast屬性的注釋。

此類的迭代器方法返回的迭代器是快速失敗的:如果在創建迭代器后的任何時間以任何方式修改集合(除非通過迭代器自己的remove方法),則迭代器將拋出ConcurrentModificationException。 因此,面對並發修改,迭代器會快速干凈地失敗,而不會在未來的不確定時間內冒任意,不確定的行為的風險。

我可以理解上面的段落,因為它非常簡單明了,但是我無法理解下面的段落。 如果我有一些簡單的示例表明快速失敗迭代器甚至可能會失敗,那么我可能會理解。

請注意,迭代器的快速失敗行為無法得到保證,因為通常來說,在存在不同步的並發修改的情況下,不可能做出任何嚴格的保證。 快速失敗的迭代器會盡最大努力拋出ConcurrentModificationException。 因此,編寫依賴於此異常的程序以確保其正確性是錯誤的:迭代器的快速失敗行為應僅用於檢測錯誤。

編輯:對不起,我使用了一個列表,但這是相同的想法。 這是關於迭代器,而不是其背后的Collection。

EDIT2:同樣,這種情況更有可能在多線程環境中發生,在多線程環境中,您有兩個線程,一個讀取,一個寫入。 當您編碼時,這些很難看清。 要解決這些問題,您需要在列表上實現讀/寫鎖定來避免這種情況。

這是注釋的代碼示例:

Iterator itr = myList.iterator();

while(itr.hasNext())
{
    Object o = itr.next();

    if(o meets some condition)
    { 
        //YOURE MODIFYING THE LIST
        myList.remove(o);
    }
}

規范說的是,您不能依賴這樣的代碼:

while(itr.hasNext())
{
     Object o = itr.next();

     try
     {
         if(o meets some condition)
            myList.remove(o);
     }
     catch(ConcurrentModificationException e)
     {
         //Whoops I abused my iterator. Do something else.
     }
}

相反,您可能應該將內容添加到新列表中,然后將myList引用切換到剛創建的列表。 這說明情況了嗎?

第二段后面的想法是防止您編寫如下代碼:

boolean ok = false;
do {
    try {
        doTheModification();
        ok = true;
    } catch {
        // Consurrent modification - retry
    }
} while (!ok);

盡管這不是一開始的好代碼,但注釋指出該代碼無效(與次優相反)。 他們說異常可能根本不會發生,因此上述循環可能會靜默地產生故障。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM