2016-12-13 2 views
0

Время выполнения указывает, что исключение возникает при предоставлении temp = keysit.next(). Я думал, что об этом позаботились, когда я переопределял keysit = keys.iterator() во второй раз, но, возможно, мне не хватает смысла. Какие-либо предложения?ConcurentModificationException при использовании Set

Map<Integer, Set<String>> lhm = new LinkedHashMap<Integer, Set<String>>(); 

public void sortMap() { 
    Set<Integer> keys = hm.keySet(); 
    Iterator<Integer> keysit; 
    int iterations = keys.size(); 
    int smallest; 
    int temp; 
    for(int i=0; i<iterations; i++) { 
     keysit = keys.iterator(); 
     smallest = keysit.next(); 
     keysit = keys.iterator(); 
     while(keysit.hasNext()) { 
      temp = keysit.next(); 
      if(temp<smallest) 
       smallest = temp; 
      lhm.put(smallest, lhm.get(smallest)); 
      keys.remove(smallest); 
     } 
    } 
    System.out.println(lhm); 
} 

ответ

-1

Дела в том, итератор содержит целочисленный флаг с именем - modCount, которые отслеживают изменения в ходе итерации.

В следующей строке кода

keys.remove(smallest); 

вы на самом деле удаления элемента из набора, который изменяет этот modcount. Поэтому в следующий раз, когда next() вызывается для получения следующего элемента, он проверяет, было ли изменено значение modcount или нет. Если да, то используйте исключение параллельной модификации.

Таким образом, вся модификация зависит от флага modcount и не зависит от того, сколько раз вы переопределяете keys.iterator().

Один хороший вариант заключается в использовании ConcurrentHashMap как предложено @Olu

-1

Используйте ConcurrentHashMap вместо HashMap или карту bcoz HashMap не потокобезопасна

+0

безопасность Нить не проблема, он будет бросать ConcurrentModificationException в однопоточных приложениях точно так же. Проблема в том, что вы удаляете элементы из набора во время итерации по нему. Вместо этого вы должны использовать метод 'remove()' итератора, если он его поддерживает. –

Смежные вопросы