集合类的java.util.ConcurrentModificationException
api说明:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常,
另外,即使在单线程中,若对此集合进行迭代时,同时修改对象也会抛出此异常。
如:
public class ConcurrentMod {
public static void main(String[] args) {
Vector<String> v = new Vector<String>();
for(int i=0; i<100; i++) {
v2.add("kkk" + i);
}
//抛出ConcurrentModificationException
// for(String str : v2) {
// v2.remove(str);
// }
//改进
Iterator<String> it = v2.iterator();
while(it.hasNext()) {
it.next();
it.remove();
}
}
}
改进方法是通过相应的Iterator进行修改,你会发现如果是单线程将不再抛出上述异常,甚至即使是多线程也不会,但是当并发数到一定数量后仍然会出现ConcurrentModificationException。这又将如何修改呢?
这就需要在对容器进行迭代修改时添加同步锁。
public class ConcurrentMod extends Thread {
@Override
public void run() {
long id = Thread.currentThread().getId();
//同步对象容器
synchronized (v) {
Iterator<String> it = v.iterator();
while(it.hasNext()) {
String str = it.next();
if(id == Long.parseLong(str)) {
it.remove();
System.out.println(str + " --- " + id);
break;
}
}
}
}
static Vector<String> v = new Vector<String>();
static {
for(int i=0; i<100; i++) {
v.add("" + i);
}
}
public static void main(String[] args) {
for(int i=0; i<10000; i++) {
ConcurrentMod run = new ConcurrentMod();
run.start();
}
}
}