【发布时间】:2018-08-25 15:12:59
【问题描述】:
我编写了以下代码来通过非线程安全对象(这里是ArrayList)运行多个线程:
import java.time.LocalDateTime;
import java.util.List;
import java.util.ArrayList;
public class A implements Runnable {
String name;
static List<Integer> list = new ArrayList();
private static Object lock = new Object();
A(String name) {
this.name = name;
}
@Override
public void run() {
for(int i = 1; i <= 1000; i++) {
list.add(i);
}
System.out.println(list.size());
}
}
我期待这段代码只是产生错误的答案,因为ArrayList 不是线程安全的。但是我得到了这个错误:
Exception in thread "Thread-1" 1003
2401
2799
3799
java.lang.ArrayIndexOutOfBoundsException: 109
at java.util.ArrayList.add(Unknown Source)
at threads.A.run(A.java:16)5123
at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-5" java.lang.ArrayIndexOutOfBoundsException: 4164
at java.util.ArrayList.add(Unknown Source)
at threads.A.run(A.java:16)
at java.lang.Thread.run(Unknown Source)
6123
谁能向我解释导致此特定错误的原因?
【问题讨论】:
-
你在哪里创建线程?告诉我你创建和启动线程的主要方法?
-
“谁能向我解释导致此错误的原因” - 是的,您正在以文档告诉您不要的方式使用该类型。当坏事发生在那个时候,你不应该感到惊讶。
-
您已将 List 声明为静态,因此该列表对 A 类的每个实例都是通用的。因此您的所有线程同时访问它。所以它崩溃了
-
@RavindraRanwala 在主课
-
那 主要是 因为
add会在数据无法放入已经存在的数组时在内部进行调整大小,因此一个线程尝试增加该数组,而另一个线程尝试放入其中(索引不存在)
标签: java multithreading arraylist concurrency