我在这里使用多个线程..一个线程正在获取列表,另一个线程正在向列表添加名称,并且这两个线程都使用共享资源,即ArrayList对象
它应该给出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");
}
}
最佳答案
Thread.start()
需要一些时间。第一个线程很可能在第二个线程开始使用其迭代器之前就已完成,反之亦然,无法预测是哪个线程。
并发的问题之一是我们必须使用“非常有可能”这样的短语,因为我们无法预测事情发生的顺序,因此某些程序的行为变得不一致。
尝试在循环中放入一些 Thread.sleep()
语句,以便您可以更加确定 ArrayList get()
在 执行时执行迭代器
已打开。
请注意,虽然添加 sleep 是一种快速而简单的方法,可以将计时“调整”到足够长的时间段,以便您可以见证某些条件的发生,但它们几乎从来都不是解决实际代码中线程同步问题的正确方法。
关于java - 为什么我能够同时读取/写入数组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36124599/