簡體   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