java.util.ConcurrentModificationException 원인 및 솔루션
12:13:30,822 [ERROR] >> com.anxin.ssk.cache.CouponCache:202
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$EntryIterator.next(HashMap.java:833)
at java.util.HashMap$EntryIterator.next(HashMap.java:831)
at com.anxin.ssk.cache.CouponCache.filterData(CouponCache.java:310)
at com.anxin.ssk.cache.CouponCache.downloadAndSaveData(CouponCache.java:410)
at com.anxin.ssk.cache.CouponCache.readLocal(CouponCache.java:291)
at com.anxin.ssk.cache.CouponCache.initCache(CouponCache.java:196)
at com.anxin.ssk.task.Scheduler$5.run(Scheduler.java:158)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
주요 원인:
API에서 볼 수 있듯이 List 등 Collection의 실현은 동기화되지 않았다. 다중 스레드 응용 프로그램에 동시 접근이 나타나고 수정 작업이 나타날 때 외부 조작의 동기화를 요구한다.Iterator 조작을 호출하여 얻은 Iterator 대상은 다중 스레드가 Set를 수정할 때도 자동으로 효력을 상실하고java를 던집니다.util.ConcurrentModificationException.이런 실현 메커니즘은fail-fast로 외부의 수정에 대해 어떠한 보증도 제공할 수 없다.
관련 정보:
인터넷에서 Iterator에 대한 작업 메커니즘을 찾습니다.Iterator는 하나의 독립된 라인에서 일하고 무텍스 자물쇠를 가지고 있다. 즉, Iterator는 작업할 때 교체된 대상이 바뀌는 것을 허락하지 않는다는 것이다.Iterator가 생성되었을 때 메모리 인덱스 테이블(단일 체인 테이블)을 만들었습니다. 이 인덱스 테이블은 원래의 대상을 가리키고, 원래의 대상 수량이 바뀌었을 때 이 인덱스 테이블의 내용이 동기화되지 않았기 때문에 인덱스 바늘이 아래로 이동할 때 교체할 대상을 찾을 수 없어서 오류가 발생했습니다.List, Set 등은 동적이고 가변 대상 수량의 데이터 구조이지만 Iterator는 단방향이 가변적이지 않고 순서만 읽을 수 있고 역순으로 조작할 수 없는 데이터 구조이다. Iterator가 가리키는 원시 데이터가 변화할 때 Iterator는 스스로 방향을 잃는다.
솔루션:
원래:
private static Map
수정:
private static Map
참조 소스:http://www.cnblogs.com/frankliiu-java/articles/1759460.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception Class에서 에러 코드 해석 ~초기초편~직장에서 C# 프로젝트가 내뿜는 오류 코드를 구문 분석하고 오류의 위치를 확인하기 위해 Exception class를 활용할 수 있었습니다. 지금까지 Exception Class 에 대해서 별로 파악할 수 없었기 때...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.