[英]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.