簡體   English   中英

並發迭代和線程安全

[英]Concurrent iteration and thread safety

我正在閱讀B. Goetz Java Concurrency In Practice,現在我正處於關於線程安全集合的部分。 他描述了可能拋出ConcurrentModificationException的所謂“隱藏迭代器”。 以下是他發布的例子:

public class HiddenIterator{

    @GuardedBy("this")
    private final Set<Integer> set = new HashSet<Integer>();

    public synchronized void add(Integer i){ set.add(i); }
    public synchronized void remove(Integer i){ set.remove(i); }

    public void addTenThings(){
        Random r = new Random();
        for(int i = 0; i < 10; i++)
            add(r.nextInt());
        System.out.println("DEBUG: added ten elements to set " + set)
    }
}

現在,顯然addTenThings()可能拋出ConcurrentModificationException ,因為打印set的內容涉及迭代它。 但他提出以下建議來處理它:

如果HiddenIterator使用synchronizedSet包裝HashSet,封裝同步,則不會發生此類錯誤。

我不太明白。 即使我們將set包裝成synchronized-wrapper,該類仍將保留NotThreadSafe 他的意思是什么?

這是因為Collections.synchronizedSet同步每個方法,包括toString 實際上,如果您嘗試手動迭代包裝集,則可能會出現ConcurrentModificationException ,因此您必須自己同步手動迭代。 但是做隱藏迭代的方法已經做到了,所以至少你不必擔心。 以下是JDK源代碼的相應代碼:

public String toString() {
    synchronized (mutex) {return c.toString();}
}

這里, mutex在包裝類的構造函數中初始化為this ,因此它基本上是synchronized (this)

暫無
暫無

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

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