我在这里使用多线程..一个线程读取列表和其他被添加一个名称列表,这两个线程使用共享资源,即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 ..我使用的是快速失败迭代器和我在修改列表声明迭代器后... shuldnt这给了一个异常? jsut好奇 – Amol
@SarthakMittal检查并发修改是尽最大努力的基础上进行的,正如文档中提到的那样。即有可能你不会得到例外。 –