最近、セマフォとマルチスレッドをいじっていましたが、配列リストで奇妙なことが起こっていることに気付きました。詳細:
単一のプライベート ArrayList を持つクラスがあります。
public class NewClass{
private ArrayList list = new ArrayList();
public void put(Object val){
list.add(val);
}
public void del(Object val){
list.remove(val);
}
}
いくつかのスレッドから、要素を削除しようとしています (その前に何も置かずに):
public class SomeClass {
public static void main(String[] args) throws InterruptedException {
new SomeClass();
}
public SomeClass() throws InterruptedException {
Thread tr2 = new Thread() {
@Override
public void run() {
NewClass nc = new NewClass();
for (int i = 0; i < 100; i++) {
nc.del(i);
}
}
};
tr2.start();
}
}
そして、スレッドが機能し始めると、エラーも例外もありません。一方、デバッグの場合、その list.indexOf(val); がはっきりとわかります。-1 値を返します - 実際には存在しませんが、「削除」されています。ここで何が起こっているのか誰でも説明できますか?