java - 为什么我能够同时读取/写入数组列表?

标签 java multithreading arraylist

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

相关文章:

java - 使用 GridLayoutManager 和 RecyclerView 更改自动适应屏幕的列数

java - 有没有一种有效的方法来测试元素是否与 Jsoup 中的选择器匹配?

multithreading - 在 Lparallel 库 (Common Lisp) 中使用队列

java - Tomcat ServletContext实现的getAttribute()方法可以不同步调用吗?

java - 如何向 String 数据类型的 ArrayList 添加数据

java - 处理大量数据

java - 使用更新语句创建列

c++ - 在不同线程中启动服务器和 IHM

java - 遍历Hash Map key的值是按降序还是升序?

java - 添加到 hashmap 和 arraylist