编辑:显然问题已被标记为this的副本,即使我的问题是关于如何在另一个线程修改它时如何安全地使用一个线程上的列表,并且链接的问题是关于如何在迭代期间删除。
问题:
我在课堂上有一个List<Object> objects
。该类还包含一个返回对象列表的getObjects()
方法。
我有两个线程正在使用此列表。一个线程不时地添加对象,另一个线程正在对它们进行处理,并在完成后从列表中删除它。当我在第二个线程中迭代列表时会出现问题,而第一个线程同时将一个对象添加到列表中。
我试图通过让线程2只使用列表的副本而不是实际的副本来解决这个问题。使用List<Object> newList = getObjects();
。在这里我假设由于newList是一个不同的列表(尽管有相同的对象),我可以安全地迭代它并使用对象。但是看起来这仍然会导致异常,因为(我假设)=
运算符只是使newList成为对象列表的引用。我还在迭代对象列表。
问题: 所以我的问题是:如何安全地处理第二个线程中列表中的对象?
代码:即使我怀疑它是否有助于回答这个问题,但这里的代码(我删除了与此问题无关的所有不必要的混乱)。< / p>
public class One
{
List<Object> objects;
public One()
{
objects = new ArrayList<Object>();
}
public void addObject(Object object)
{
objects.add(object);
}
public List<Object> getObjects()
{
return objects;
}
}
public class Two
{
private One one;
public Two(One one)
{
this.one = one;
}
public void processObjects()
{
List<Object> newList = one.getObjects();
for(Object object : newList) //Causes error because during iteration thread 1 adds an object to the objects list.
{
//dostuff with the object.
}
one.getObjects().removeAll(newList);
}
}