java.util.ConcurrentModificationException

最近一次系统内存泄漏,排查发现是一个框架的清资源的线程异常退出导致的,退出的原因就是抛出了ConcurrentModificationException。

何时抛ConcurrentModificationException?

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

这个解释其实挺不清楚的,什么叫做没有权限时的修改啊,哪些情况啊。目前所知的是对Collection 遍历时的修改要特别注意。

http://stackoverflow.com/questions/8189466/java-util-concurrentmodificationexception

抛异常代码如下:

 1 static
 2     {
 3         Thread th = new Thread("ShyCacheScanThread"){
 4             public void run()
 5             {
 6                 while( true )
 7                 {
 8                     try{ Thread.sleep(DEFAULT_CHECK_INTERVAL); }catch(InterruptedException e){}
 9                     synchronized( ALL_CACHE )
10                     {
11                         for( AbstractCache cache : ALL_CACHE )
12                         {
13                             int x = Math.min(cache.mCapacity/2,cache.mMap.size()-cache.mCapacity);
14                             if( x > 0 )
15                                 cache.evict(x);
16                         }
17                     }
18                 }
19             }
20         };
21         th.setDaemon(true);
22         th.start();
23     }

其中ALL_CACHE是一个List对象,其实这段代码没有什么问题,只是对ALL_CACHE做了遍历,但是这里要特别小心的是,在修改这个对象的其他地方也必须加锁才行,但是不幸的是

1 public AbstractCache(int capacity)
2     {
3         if( capacity <= 0 )
4             throw new IllegalArgumentException("capacity <= 0");
5         mCapacity = capacity;
6         mMap = new IntHashMap(capacity);
7         ALL_CACHE.add(this);
8     }

在此处对ALL_CACHE的修改并没有加锁,一旦构造AbstractCache时,ShyCacheScanThread在遍历,那异常就抛出来了。

解决方法就是在add处也加上ALL_CACHE对象的锁,但是并不是很优雅。另我不解的是为啥框架的cache实现要这样子,唉~

问题还没有结束~~

为什么以前没有发生,最近却频频发生?因为上面这段代码只在初始化化的时候运行一次,之后就不会有修改了

时间: 2024-10-12 12:46:26

java.util.ConcurrentModificationException的相关文章

Java.util.ConcurrentModificationException的理解与修改

在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" java.util.ConcurrentModificationException, 下面介绍异常原因以及这种异常的改进方法,内容很简单,有什么问题还望指正. 假设我们要实现这样一个例子: 判断集合里面有没有"world"这个元素,如果有,就添加一个"javaee"元素 出现异常的代码如下: import java.util.ArrayList;

遇到java.util.ConcurrentModificationException

今天犯了一个简单的错: List<Book> books = adapter.data; for(Book book: books){     if(book.id == bookId){         books.remove(book);     } } 结果遇到java.util.ConcurrentModificationException,起初以为是Android里操作不在同一线程的UI的问题,其实没那么复杂,只是犯了一个常见的Java错误.改为下面即可: List<Book

有关java.util.ConcurrentModificationException

有关java.util.ConcurrentModificationException java doc对这个类的定义: This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. For example, it is not generally permissible for o

LinkedList - java.util.ConcurrentModificationException

package com.test.io; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.LinkedList; import com.mysql.jdbc.Buffer; public class ReadKeyFile { public static void

java集合--java.util.ConcurrentModificationException异常

ConcurrentModificationException 异常:并发修改异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.一个线程对collection集合迭代,另一个线程对Collection进行修改的时候, 就会出现上面的异常. 下面看一下代码: package cn.itcast.p4.list.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; pub

java.util.ConcurrentModificationException 解决 Android

java.util.ConcurrentModificationException 解决       Android  java 在项目里面 遇到了这个bug : E/AndroidRuntime(22055): java.util.ConcurrentModificationException E/AndroidRuntime(22055):      at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 查看了下

java.util.ConcurrentModificationException异常分析

Java在操作ArrayList.HashMap.TreeMap等容器类时,遇到了java.util.ConcurrentModificationException异常.以ArrayList为例,如下面的代码片段: [java] view plaincopy import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArr

java.util.ConcurrentModificationException 异常解决办法及原理

最近在修程序的bug,发现后台抛出以下异常: Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) at java.util.HashMap$KeyIterator.next(HashMap.java:828) at com.keyman.demo.test.ClearResult

java.util.ConcurrentModificationException的解决办法

今天在使用iterator.hasNext()操作迭代器的时候,当迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 编译器报出了以下异常: Exception in thread "main" java.util.ConcurrentModificationException at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719) at java.util.LinkedHash

android详细信息java.util.ConcurrentModificationException变态

在今天做android当项目,我遇到了这个异常,好吧.其实最不寻常遇到异常IllegalstateException.它们与我们的硬件连接SDK抛出,我想折磨学生阿玉啊.扯远了. 今天,我想回到这个异常.java.util.ConcurrentModificationException异常,一開始我愣了一下.貌似从来没遇到过这个,然后果断百度大神.这才发现: 原因是你遍历该集合时.对该集合进行了删除元素的操作导致的.假设你有删除元素的必要,建议赋值到还有一个集合,然后对他进行删除操作. 偶出现错