ここでは複数のスレッドを使用しています.1つのスレッドがリストをフェッチしていて、他のスレッドがリストに名前を追加していて、両方のスレッドが共有リソースを使用しています。ArrayList object
concurrentModification
は、私は私のコードで正しくスレッドを使用することはできませんよなぜ私は同時にarraylistを読み書きできますか?
コードは次のとおりです。
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これは例外を与えますか?好奇心が強い。 – Amol
@SarthakMittalの同時修正のチェックは、ドキュメントで述べられているように、ベストエフォート方式で行われます。 e。あなたが例外を取得しないチャンスがあります。 –