【发布时间】:2014-11-27 22:11:19
【问题描述】:
我正在尝试跨两个不同线程访问单个列表。最初,我使用的是 for 循环,如下所示:
for (int i = 0; i<fighterList.size(); i++) {
if (fighterList.get(i).isDestroyed() == true) fighterList.remove(i);
}
然而,我被告知我必须同步线程。我不太明白如何做到这一点,更重要的是它是如何工作的。到目前为止,我咨询过的资源似乎指向了两种不同的方法:
synchronized(fighterList) {
for (Object o : fighterList) {
o.doSomeMethod();
}
}
或
Iterator<Fighter> iterator = fighter.iterator();
while (iterator.hasNext())
if (iterator.next().returnSomething() == false) iterator.next().doSomeMethod();
}
然而,这些似乎都不起作用。执行此操作的“正确”方法是什么,是否有更好的文档可用?
【问题讨论】:
-
“这些似乎都不起作用”不是问题描述。您需要描述您想要实现的行为以及您得到的结果。还包括short but full code which will let us reproduce your problem。
-
即使没有多个线程访问
fighterList,第一个示例也会失败,因为它在迭代列表时修改了列表,这是被禁止的! -
您可以使用
synchronized包装器进行包装,请参阅Collections.synchronizedList -
@MadProgrammer 如果我没记错的话
synchronizedList使单个操作成为原子操作(添加、包含、删除...),因此 OP 还需要为这些操作集提供单独的同步。根据 OP 真正想要实现的目标, CopyOnWriteArrayList 也可能是一种选择。无论如何,要回答这个问题,我们(或至少我)需要更多信息。 -
@Pshemo 是的,因为缺少上下文 ;) - 此外,根据具体情况,同步操作可能会更好(调用的方法)......但上下文为王 ;)跨度>
标签: java swing arraylist synchronized