为什么我能同时读/写arraylist?

时间:2016-03-21 06:39:21

标签: java multithreading arraylist

我在这里使用多个线程..一个线程正在获取列表,另一个线程正在为列表添加一个名称,这两个线程都在使用共享资源,即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"); 
 } 
}

4 个答案:

答案 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

之类的内容