【问题标题】:Is happens-before relation given in case of invokeLater() or invokeAndWait?在invokeLater() 和invokeAndWait 的情况下是否给出了happens-before 关系?
【发布时间】: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


【解决方案1】:

简而言之:是的,在调用invokeLater/invokeAndWait 的线程的操作与由此提交的可运行文件的EDT 上的操作之间存在happens-before 关系。否则,整个 API 的完整性将受到威胁。

不幸的是,很难得到任何权威来源来证实这一点。很多关于 Swing 和并发的东西都会发生这种情况。

有关更多信息,请参阅长期 Swing 大师 trashgodthis answer

【讨论】:

  • @MarkoTopolnik:谢谢!我想,我必须接受这一点。由于 AWT EventQueue 在通过 invokeLater() 将任务/Runnables 推入 EventQueue 时保证 FIFO 顺序,因此必须进行同步。因此,我们可以假设“invokeLater() 的调用”发生在“任务开始”之前,并且可见性已经给出(在这个方向上)。该任务至少会看到调用 invokeLater() 时的值。无论如何,我宁愿不需要考虑内部实现,而是有一个权威的来源(例如 API)来保证。
  • 我认为这种行为不一定要记录在案。见stackoverflow.com/q/64497416/3882565
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多