2015-06-17 51 views
-1

at oldSet.removeAll(deleted);這個異常被拋出Java Set「ConcurrentModificationException」

ConcurrentModificationException的

我加上 「同步」 的關鍵字,但沒有任何變化!

Set<Employees> deleted; 

Set<Employees> oldSet = new TreeSet<Employees>(new EmployeeComparator()); 
oldSet.addAll(employeesListDB); 

Set<Employees> newSet = new TreeSet<Employees>(new EmployeeComparator()); 
newSet.addAll(employeesList);  

try{  

    deleted = Sets.difference(oldSet, newSet); 

    Set<Employees> added = Sets.difference(newSet, oldSet); 

    ***oldSet.removeAll(deleted);*** 
    oldSet.addAll(added);   

}catch(Exception ex){ 
    System.out.println(ex.getMessage()); 
} 

我還試圖迭代但出現相同異常:

Iterator it = oldSet.iterator(); 
      Employees e; 
      while(it.hasNext()) 
      { 
       e= (Employees)it.next(); 
       if(oldSet.contains(e)) 
        oldSet.iterator().remove(); 
      } 
+0

這有一個解決方案[這裏](http://stackoverflow.com/questions/1496180/concurrent-modification-exception)。 –

+0

nope,它不能解決我的問題,我正在使用Set not List! –

+0

使用迭代器是它的關鍵。 –

回答

2

ConcurrentModificationException未鏈接到一個同步(多線程)的問題。

從Javadoc中:此異常可能由已檢測出的對象的併發修改時這種修改是不允許的方法被拋出....注意,此異常並不總是指示一個對象已經被同時修改通過不同的線程...

它發生,例如,如果我們通過遍歷Collection(使用迭代器),你改變Collection在(添加或去除例如元素)同時進行。

+0

我怎麼能過來它在集 –

+0

這裏是答案:http://stackoverflow.com/questions/8490901/com-google-common-collect-sets-setview-bug-or-feature –