【发布时间】:2014-02-04 12:02:12
【问题描述】:
很确定是这样 - 但我想确定 - 在invokeLater() 或invokeAndWait() 的情况下是否给出了happens-before 关系?
这些方法在(分别为 SwingUtilities)AWT.EventQueue 中定义。 我猜在 EventQueue 中输入某些内容时会涉及同步 因此作为同步的结果,happens-before 关系和可见性最终被给出。
但真的是这样吗? (我在哪里可以找到这些信息?)
例如 在一些工作线程中
...
*<1> heavy computation modifying lots of DATA*
...
SwingUtilities.invokeLater(
new Runnable() {
@Override
public void run() {
*<2> is visibility of modified DATA guaranteed?*
}
}
);
例如 在某个线程内
...
SwingUtilities.invokeAndWait(
new Runnable() {
@Override
public void run() {
...
*<1> change some DATA*
}
}
);
*<2> is visibility of modified DATA guaranteed?*
【问题讨论】:
-
我真的不明白你想问什么。
-
在第一个示例中,在位置 的某个线程中,数据被更改,然后调用 invokeLater()。更改后的数据是否在可运行文件内的 位置可见。
-
invokeAndWait 必须在 EDT 外调用,通过 isEventDispatchThread 测试必须返回 false,否则一些异常会冻结 Swing GUI,可以永远依赖于
-
n 第一个示例在某个线程中的位置 数据被更改,然后调用 invokeLater()。更改的数据是否在可运行文件内的 位置可见。在第二个示例中,再次在位置 处更改数据,稍后(在可运行对象之外)当 invokeAndWait() 完成时,它在位置 处被访问。更改后的数据是否再次可见?
-
感谢“mKorbel”的回复。看看 Brain Goetz 的“JAVA - Concurrency in practice”,你需要同步来保证发生之前的关系,因此你可以获得数据的可见性。我找不到任何 invokeLater() 保证发生前发生或数据可见性的信息。
标签: java swing event-dispatch-thread invokelater happens-before