繁体   English   中英

为什么我能够同时读取/写入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM