从单独的线程

时间:2016-04-10 20:05:00

标签: java multithreading arraylist thread-safety

我有一个包含3个线程的程序(不包括主线程)。第一个线程在窗口上移动一个对象,第二个线程检查对象冲突,第三个线程应该定期添加到对象的ArrayList。所有这三个线程都在操纵同一个对象列表(虽然前两个实际上并没有改变列表,只是里面的对象)。但是,当要添加到列表的线程尝试添加对象时,我收到错误。是否可以从不同的线程操作ArrayList?

2 个答案:

答案 0 :(得分:2)

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

  

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

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

还值得一读Synchronization Tutorial

答案 1 :(得分:0)

首先,如果您有多线程应用程序...更喜欢使用类似Vector而不是ArrayList的内容,因为ArrayList不被视为线程安全。

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