我在这里使用多个线程..一个线程正在获取列表,另一个线程正在为列表添加一个名称,这两个线程都在使用共享资源,即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");
}
}
答案 0 :(得分:3)
两个线程中的每一个花费的时间都很少(在现代CPU上可能不到1微秒),它们实际上同时执行的可能性非常低。你必须在两个线程中做大量的工作才能确保它们同时处于活动状态。
答案 1 :(得分:3)
Thread.start()
需要一些时间。第一个线程很可能在第二个线程开始使用其迭代器之前完成 - 反之亦然,没有办法预测哪个。
并发性的一个问题是我们必须使用“非常可能”之类的短语,因为我们无法预测事情发生的顺序,因此某些程序的行为会变得不一致。
尝试在循环中放入一些Thread.sleep()
语句,以便在get()
打开时更可靠地执行ArrayList Iterator
。
请注意,虽然添加睡眠是一种快速简便的方法,可以将时间“摆弄”到足够长的时间段,您可以看到某些情况发生,但它们几乎不是解决实际代码中线程同步问题的正确方法。
答案 2 :(得分:2)
正如@Slim提到的那样,由于显示和添加时线程的延迟。 通过添加Sleep修改您的代码如下,这将导致concurrentModificationException。
void displayList() throws InterruptedException {
Iterator<String> itr = f.iterator();
while (itr.hasNext()) {
String name = itr.next();
Thread.sleep(100);
System.out.print(name + " ");
}
System.out.println();
}
...
void addName() throws InterruptedException {
Thread.sleep(100);
m.add("rohit");
}
例外:
amol Exception in thread "thread-F" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at fetch.displayList(TestClass.java:43)
at fetch.run(TestClass.java:33)
at java.lang.Thread.run(Thread.java:745)
答案 3 :(得分:0)
ArrayList
不是线程安全的。您可能应该查看ConcurrentLinkedDeque