java.util.ConcurrentModificationException 원인 및 솔루션

2923 단어 exceptionsolution
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 _couponMap = new HashMap();
 
수정:
private static Map _couponMap = new ConcurrentHashMap();
 
참조 소스:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

좋은 웹페이지 즐겨찾기