简单的多线程程序崩溃?

时间:2015-10-25 00:10:51

标签: java multithreading runnable

当我运行它时,我有以下程序,它崩溃了。看起来在运行时存在一些问题。我无法理解什么是错的?任何人都可以提供任何解释吗?

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

2 个答案:

答案 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中,因此每个线程都有自己的列表。这样它应该可以工作。