【发布时间】:2016-10-26 09:01:28
【问题描述】:
为什么Arraylist在多线程添加元素时大小不合适?
threadCount = 100;
List<Object> list = new ArrayList<>();
for (int i = 0; i < threadCount; i++) {
Thread thread = new Thread(new MyThread(list, countDownLatch));
thread.start();
}
class MyThread implements Runnable {
// ......
@Override
public void run() {
for (int i = 0; i < 100; i++) {
list.add(new Object());
}
}
}
这个程序完成后,列表的大小应该是 10000。实际上,大小可能是 9950、9965 或其他一些数字。为什么?
我知道为什么这个程序可能会引发IndexOutofBoundsException 以及为什么其中有一些空值,但我就是不明白为什么大小不对。
【问题讨论】:
-
ArrayList 不是线程安全的。
-
来自文档:“请注意,此实现不同步。如果多个线程同时访问 ArrayList 实例,并且至少有一个线程在结构上修改了列表,则必须在外部同步。”你没有这样做。
-
@fei_hsueh 文档基本上说该行为是未指定的 - 所以它可能有效也可能无效......
-
@fei_hsueh 问题是问为什么尺寸 is 不对,而不是为什么尺寸没有错。
-
“我知道。” 那是谎言。如果你真的知道它,那么这个问题就不会在这里。只需谷歌“比赛条件”。可能的骗子:stackoverflow.com/questions/3836680/… 和 stackoverflow.com/questions/34510/what-is-a-race-condition
标签: java arraylist concurrency