![](/img/trans.png)
[英]Why am I not able to take the following string as input and add it to an ArrayList?
[英]Why i am able to read/write arraylist at same time?
我在这里使用多个线程..一个线程正在获取列表,另一个正在向列表添加名称,并且这两个线程都使用共享资源,即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");
}
}
两个线程中的每个线程都花费很少的时间(在现代CPU上可能不到1微秒),因此它们实际上同时执行的机会非常低。 您必须在两个线程中都进行大量工作,以确保它们同时处于活动状态。
Thread.start()
需要一些时间。 第一个线程很可能在第二个线程开始使用其Iterator之前就已经完成-反之亦然,无法预测哪个线程。
并发性的问题之一是我们必须使用“非常可能”之类的短语,因为我们无法预测事物发生的顺序,因此某些程序的行为变得不一致。
尝试将一些Thread.sleep()
语句放入循环内,以便可以更确定在打开Iterator
同时执行ArrayList get()
。
请注意,虽然添加睡眠是一种将时间“弄乱”足够长的时间的简便快捷方法,您可以看到某些情况的发生,但它们几乎永远不是解决实际代码中线程同步问题的正确方法。
正如@Slim提到的,由于显示和添加时线程的延迟。 通过添加Sleep如下修改您的代码,这将导致parallelModificationException。
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)
ArrayList
不是线程安全的。 您可能应该在看类似ConcurrentLinkedDeque的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.