2016-04-10 50 views
0

我有一个3线程(不包括主线程)的程序。第一个线程移动窗口中的对象,第二个线程检查对象冲突,第三个线程应该定期添加到对象的ArrayList。所有这三个线程都在操纵同一个对象列表(尽管前两个实际上并没有改变列表,只是内部的对象)。但是,当意图添加到列表的线程尝试添加对象时,我收到一个错误。是否有可能从一个不同的线程操纵一个ArrayList?从单独的线程添加到ArrayList

回答

2

您可以通过将处理数组列表的代码放入synchronized(arrayList) { ... }块中来防止竞争条件。

2

是的,你可以在多个线程中处理数组。关于在对象中使用​​关键字,您可以在Java documentation中阅读更多内容。

0

首先,如果您有多线程应用程序...宁愿使用类似Vector而不是ArrayList,因为ArrayList不被视为线程安全。

另外,为了处理并发性,您可以使用make​​方法并对其执行操作,或使用​​块。

+1

Java将无法识别“同步” - 它必须拼写为“同步”。 – ajb

2

ArrayList没有什么特别的,它可以防止它从多个线程读取和写入。但是,请注意warning in the Javadoc

请注意,此实现不是同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则它必须在外部同步。 (结构修改是任何添加或删除一个或多个元素的操作,或明确调整后备数组的大小;仅设置元素的值不是结构修改。)这通常通过同步某些自然封装名单。如果不存在这样的对象,则应使用Collections.synchronizedList方法“列出”列表。这最好在创建时完成,以防止意外的名单不同步访问:

List list = Collections.synchronizedList(new ArrayList(...)); 

还值得通过Synchronization Tutorial阅读。