如果在工作代码和非工作代码之间唯一改变的是println语句,那么几乎可以肯定会有线程问题。该System.out.println()
语句增加了一个小暂停,这可能会偶然导致它的行为,但不能解决问题。您可以执行以下操作:
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
}
…代替它并检查相同的行为,如果确实相同,那么这几乎可以确认线程问题。但是,正如下面所指出的,它println()
还会做其他一些事情,例如引起内存障碍,因此这不是万无一失的测试。另一个也许更好的检查方法是暂时替换ArrayList
为Vector
,这是线程安全的- 尽管这是一个旧式集合,所以不建议在最终代码中使用。
如果是这种情况,听起来您没有ArrayList
正确同步调用-ArrayList
不是线程安全集合。每当您读取或写入列表时,都应在同步块内进行操作,如下所示,在列表上进行同步:
synchronized(list) {
list.whatever();
}