![](/img/trans.png)
[英]Why am I not able to take the following string as input and add it to an 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.