我在這裏使用多線程..一個線程讀取列表和其他被添加一個名稱列表,這兩個線程使用共享資源,即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");
}
}
這是從來沒有說我們不能做你在做什麼,它只是不安全做到這一點,可以產生模糊的結果 –
@SarthakMittal ..我使用的是快速失敗迭代器和我在修改列表聲明迭代器後... shuldnt這給了一個異常? jsut好奇 – Amol
@SarthakMittal檢查併發修改是盡最大努力的基礎上進行的,正如文檔中提到的那樣。即有可能你不會得到例外。 –