【发布时间】:2016-03-21 06:39:20
【问题描述】:
我在这里使用多个线程 .. 一个线程正在获取列表,另一个正在向列表添加名称,这两个线程都在使用共享资源,即 ArrayList object 它应该给 concurrentModification 类似的东西没有给出,或者我无法在我的代码中正确使用线程
代码如下:
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class threadprac
{
public static void main(String args[]){
ArrayList<String> shared;
shared = new ArrayList<>();
String[] arr=new String[]{"amol","robin","shanu","saaru","mohit"};
for(String n:arr)
shared.add(n);
Thread tf = new Thread(new fetch(shared));
Thread tm = new Thread(new manipulate(shared));
tm.setName("thread-M"); tf.setName("thread-F");
tf.start();
tm.start();
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(threadprac.class.getName()).log(Level.SEVERE, null, ex);
}
for(String n:shared)
System.out.print(n+" ");
}
}
class fetch implements Runnable
{
ArrayList<String> f;
fetch(ArrayList shared){
this.f=shared;
}
@Override
public void run(){
displayList();
}
void displayList(){
Iterator<String> itr=f.iterator();
while(itr.hasNext()){
String name = itr.next();
System.out.print(name+" ");
}
System.out.println();
}
}
class manipulate implements Runnable
{
ArrayList<String> m;
manipulate(ArrayList shared){
this.m=shared;
}
@Override
public void run(){
addName();
}
void addName(){
m.add("rohit");
}
}
【问题讨论】:
-
从来没有说过我们不能做你正在做的事情,这样做是不安全的,并且会产生模棱两可的结果
-
@SarthakMittal .. 我正在使用一个快速失败的迭代器,并且在声明迭代器后我正在修改列表......这不应该是一个例外吗?只是好奇
-
@SarthakMittal 检查并发修改是尽最大努力执行的,如文档中所述,i。 e.有可能你不会得到异常。
-
只是为了精确:我相信在声明迭代器之后修改列表,不足以激起
ConcurrentModificationException。它通常会在列表被修改后在迭代器上调用next()或hasNext()时抛出。不过,它仍然可能发生在您的程序中。 -
顺便说一下,在我的 Mac 上运行您的程序时,我有时会收到
ConcurrentModificationException。
标签: java multithreading arraylist