2016-03-17 72 views
3

我有一個arrayList,我在兩個線程之間共享,我試圖迭代和修改列表在同一時間。我不想使用迭代器的方法,我也使用了同步列表,但它仍然給出concurrentmodificationexception如何迭代和修改這個Arraylist?

代碼如下:

public class testing { 
    public static void main(String args[]){ 

    ArrayList<String> al = new ArrayList<String>(); 
    List<String> sal=Collections.synchronizedList(al); 
    String names[] = {"amol","Robin","vikas","shanu","mahesh"}; 
    for(String x :names){ 
     al.add(x); 
    }  

    Thread t1 = new Thread(new SyncArrayList(sal)); 
    Thread t2 = new Thread(new SyncArrayList(sal));  
    t1.setName("T1"); 
    t2.setName("T2"); 
    t1.start(); 
    t2.start(); 

    } 
} 

class SyncArrayList implements Runnable 
{ 
List<String> unsync ; 

SyncArrayList(List<String> l){ 
    this.unsync = l; 
} 

@Override 
public void run() { 
    displayUnsyncList(); 
    addNames(); 
    } 

void displayUnsyncList(){ 
    synchronized(this){ 
    ListIterator<String> itr = unsync.listIterator(); 
    while(itr.hasNext()){ 
     String x = itr.next(); 
     System.out.println("Thread " +Thread.currentThread().getName() + " is displaying name : "+x); 
    } 
    } 
} 

void addNames(){ 
    unsync.add("preet"); 
    } 

} 
+0

此代碼應拋出'NullPointerException'就行'列表 UNSYNC = Collections.synchronizedList(unsyn);','以來unsyn'爲空。 –

+0

我無法編輯我的問題..似乎是一些錯誤考慮'列表異步'作爲第一行 – Amol

回答

1

javadocCollections.synchronizedList(...)解釋你需要做什麼:

void displayUnsyncList() { 
     synchronized (unsync) { 
     ListIterator<String> itr = unsync.listIterator(); 
     while (itr.hasNext()) { 
      String x = itr.next(); 
      System.out.println("Thread " + 
           Thread.currentThread().getName() + 
           " is displaying name : " + x); 
     } 
    } 

總之,您的代碼正在同步錯誤的對象。

2

在多線程環境中,你應該考慮使用CopyOnWriteArrayList不產生ConcurrentModificationException

0

您使用的迭代器是快速失敗的迭代器。快速迭代器直接讀取內部數據結構。迭代整個集合時,不應修改內部數據結構。

當一個或多個線程在集合上迭代時,您應該使用Fail-safe迭代器,在一個線程更改集合的結構時。

public static void main(String args[]) { 

    ArrayList<String> al = new ArrayList<String>(); 
    List<String> sal = Collections.synchronizedList(al); 
    String names[] = { "amol", "Robin", "vikas", "shanu", "mahesh" }; 
    for (String x : names) { 
     al.add(x); 
    } 

    Thread t1 = new Thread(new SyncArrayList(sal)); 
    Thread t2 = new Thread(new SyncArrayList(sal)); 
    t1.setName("T1"); 
    t2.setName("T2"); 
    t1.start(); 
    t2.start(); 

} 

}

類SyncArrayList實現Runnable { 列表unsyn;

// List<String> unsync = Collections.synchronizedList(unsyn); 

SyncArrayList(List<String> l) { 
    this.unsyn = new CopyOnWriteArrayList<String>(l); 
} 

@Override 
public void run() { 
    displayUnsyncList(); 
    addNames(); 
} 

void displayUnsyncList() { 
    synchronized (this) { 
     Iterator<String> it = unsyn.iterator(); 
     while (it.hasNext()) { 
      System.out.println("Thread " + Thread.currentThread().getName() + " is displaying name : " + it.next()); 
     } 
    } 
} 

void addNames() { 
    unsyn.add("preet"); 
}