Node子列表的并发修改问题

时间:2016-05-26 18:26:17

标签: java multithreading javafx

我有一个问题可能是它在列表的并发修改中引起的,我想知道在这种情况下究竟发生了什么:

List<Node> childrenUnmodifiable = shipCanvas.getChildrenUnmodifiable();
for (Node node : childrenUnmodifiable) {
    ...

shipCanvas的类型为javafx.scene.layout.Pane。 在上面的例子中,我可能会在for循环的行上得到java.util.NoSuchElementException。我的假设是否正确,因为在创建childrenUnmodifiable列表时,列表被更改了? 当我采用防御性复制策略时:

List<Node> childrenUnmodifiable = new ArrayList<>(shipCanvas.getChildren());
for (Node node : childrenUnmodifiable) {
    ...

创建java.util.ConcurrentModificationException时我得到childrenUnmodifiable。 有什么选择可以避免这种行为?从列表中检索实际上不再存在的元素是可以接受的。 我可以看到两个选项:

  1. 锁定对shipCanvas
  2. 子女的所有访问权限
  3. 在一个线程中执行所有操作。
  4. 我对这两个选项都不满意,尤其是第二个选项,因为单个线程必须是UI线程。那么我还缺少其他选择吗?

0 个答案:

没有答案