ArrayList
의 반복자는 디자인에 의해 르파 때문에 당신은 ConcurrentModificationException
을 얻고있다. 즉, 일단 반복자가 생성되면 ArrayList
이 (요소의 추가 또는 제거)으로 수정되면 ConcurrentModificationException
이 반환됩니다. 당신이 예외 로그 문을 선택하면
, 그것은 때문에 수정을위한 반복자 검사 next()
방법 목록에서 반복자를 만드는 동안 사본을 IT modCount
변수를 사용하여 ArrayList
의 크기의 checkForComodification()
메서드를 호출하여 itr.next()
방법으로 라인 String s=itr.next();
에서 발생합니다.
이제 CopyOnWriteArrayList
에 대한 이야기를 할 수 있습니다 당신은 CopyOnWriteArrayList
새에 내부 배열을 복사하여 구현되는 스레드 안전 세인 것을 모든 변경 조작이 추가, 제거 좋아하는 ArrayList
의, 세트이기 때문에이 예외가 점점되지 않는 경우 하나는 새로 생성 된 배열로 이전 배열을 대체합니다.
목록에서 iterator를 가져 오면 배열에 대한 참조가 저장되고 목록에 요소를 추가하면 목록의 배열이 완전히 새로워집니다. 그리고 반복자는 여전히 이전 배열을 가리키고 있습니다.
성명 l.add("d");
에 새로 추가 된 요소가 콘솔에 인쇄되어 있지 않은 것을 확인했을 것입니다. 그러나 전체 목록을 인쇄하면됩니다.
List<String> l = new CopyOnWriteArrayList<>();
l.add("a");
l.add("b");
l.add("c");
Iterator<String> itr = l.iterator();
l.add("d");
while (itr.hasNext()) {
String s = itr.next();
System.out.println(s);
}
System.out.println(l);
출력은 생산은 다음과 같습니다 :이 도움이
a
b
c
[a, b, c, d]
희망
여기 CopyOnWriteArrayList
와 샘플 코드입니다. 즐기십시오 :)
나는 이미 했어요 ... "concurrent-collection" –
마우스를 가져 가면 마우스가 JNet 것이 아닌 .Net 개념이라고 설명합니다. 예외를 얻는 이유는 이미 iterator를 얻은 후에 콜렉션 (AL)을 변경하기 때문입니다. 여기에 관련된 스레드의 수는 중요하지 않습니다. – StuartLC
나는 ..didnt 공지를 .net 개념을 보여 주듯이 변경했다. –