当我运行它时,我有以下程序,它崩溃了。看起来在运行时存在一些问题。我无法理解什么是错的?任何人都可以提供任何解释吗?
public static void main(String[] args) {
final ArrayList<Object> holder = new ArrayList<>();
final Runnable runnable = new Runnable() {
public void run() {
for (int i = 1; i <= 1000000; i++) {
holder.add(new Object());
}
}
};
new Thread(runnable).start();
new Thread(runnable).start();
new Thread(runnable).start();
}
这是错误消息,但为什么我会收到ArrayIndexOutOfBoundsException
。任何人都可以提供解释吗?
Exception in thread "Thread-5" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 244
答案 0 :(得分:4)
您有多个线程添加到ArrayList。但是,添加不是线程安全的操作
请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改。)
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
答案 1 :(得分:0)
您收到此错误,因为多个线程尝试访问同一列表。例如,如果线程1访问列表索引20并且同时线程2访问列表索引20,则会导致问题。有一个简单的解决方案可以解决这个问题:
public static void main(String[] args) {
final Runnable runnable = new Runnable() {
public void run() {
final ArrayList<Object> holder = new ArrayList<>();
for (int i = 1; i <= 1000000; i++) {
holder.add(new Object());
}
}
};
new Thread(runnable).start();
new Thread(runnable).start();
new Thread(runnable).start();
}
我简单地将List放在run()
- Method中,因此每个线程都有自己的列表。这样它应该可以工作。