JAVA 집합 에서 요 소 를 삭제 할 때의 java. util. ConcurrentModificationException

JAVA 의 집합 (LIST, SET) 에서 iterator. hasNext () 또는 iterator. next () 를 통 해 집합 중인 데 이 터 를 옮 겨 다 닐 때 이때 add 또는 reove 집합 에 있 는 요 소 를 사용 하면 Concurrent ModificationException 이상 이 발생 합 니 다.
본 고 는 이런 현상 과 해결 방법 을 간단하게 설명 한다.
아래 코드 와 같이 reove 든 add 든 Concurrent ModificationException 이상 이 발생 합 니 다.
4. 567913. reove 에 대한 해결 방법 은 iterator 를 이용 한 reove 방법 입 니 다.
4. 567913. 집합 이 특정한 조건 을 만족 시 키 는 상황 에서 add 요소 의 해결: 먼저 add 할 요 소 를 다른 집합 에 두 고 판단 이 완 료 된 후에 가입 합 니 다.
4. 567913. 여기 서 재 미 있 는 현상 을 만 났 습 니 다. 아래 코드 는 Concurrent ModificationException 이 발생 하지 않 았 습 니 다. 3 개의 요소 만 있 는 집합 에서 remove 두 번 째 요 소 는 Concurrent ModificationException 이 발생 하지 않 았 고 마지막 집합 에 1 과 3 만 있 었 습 니 다. remove 1 과 3 에 이상 이 있 을 수 있 습 니 다. add 요소 에 도 이상 이 있 습 니 다. 혹시 JDK 의 bug 입 니까?한 마디 로 하면 reove 요 소 를 사용 할 때 iterator 의 reove 방법 을 사용 해 야 합 니 다.
읽 기와 동시에 수정 하려 면 CopyOnWriteArrayList 또는 CopyOnWriteArraySet 을 사용 하 십시오.
    public static void testWrongAccess2() {
        Collection<String> myCollection = new ArrayList<String>(10);
        myCollection.add("1");
        myCollection.add("2");
        myCollection.add("3");
        myCollection.add("4");
        Iterator itr = myCollection.iterator(); 
        while (itr.hasNext()) {
            String myObject = (String) itr.next();
            System.out.println(myObject);            
            if ("2".equals(myObject)) {
                myCollection.remove(myObject); // cause ConcurrentModificationException
                //myCollection.add("4"); // cause ConcurrentModificationException
            }
        }
    }

//1.5            
        for (String myObject: myCollection) {           
            System.out.println(myObject);           
            if ("2".equals(myObject)) {
                myCollection.remove(myObject);
            }
        } 

좋은 웹페이지 즐겨찾기