2013-10-23 55 views
0

我们在GUI日志中发现了一个ConcurrentModificationException异常,这似乎与更改支持表模型的列表有关。Java Swing/EDT事件处理同步

顺序似乎是:

  1. 事件1触发列表
  2. 改变列表的背衬列表迭代和改变触发中断当前执行(变更的副产品事件)的事件2。 此事件在事件1的处理结束之前处理
  3. 事件2也会更改列表。
  4. 事件1获得控制权,并继续迭代,因为后台列表已经改变

因为他们都在美国东部时间,如果我使用synchronized关键字(或锁定),在这两个地方它吹起来,将event2放弃并让event1处理继续,否则我会创建一个奇特的死锁?

+0

您还没有创建一些新的死锁。它被称为脏读,并且非常有名。 –

回答

2

似乎与更改支持表模型的列表有关。

您不应该更改列表。所有更新应该直接在模型上完成。

在许多情况下,当您有ConcurrentModificationExecption时,可以将该代码包装在SwingUtilities.invokeLater()中,以便将代码添加到EDT的末尾,从而允许第一个事件完成处理。

+0

因此,同步/锁定会导致死锁? – rediVider

+0

@rediVider:你可能会阻止EDT;使用'invokeLater()'将对'Runnable'进行排队,导致它在所有待处理事件处理完成后发生。 – trashgod