很确定就是这样 - 但我想肯定地知道 - 在invokeLater()或invokeAndWait()的情况下给出关系之前发生了吗?
方法在(SwingUtilities分别)AWT.EventQueue中定义。 我想在EventQueue中输入内容时会涉及同步 因此,作为同步的结果,发生在之前的关系,最后给出了可见性。
但是真的那样吗? (我在哪里可以找到这些信息?)
e.g。 在一些工作线程中
...
*<1> heavy computation modifying lots of DATA*
...
SwingUtilities.invokeLater(
new Runnable() {
@Override
public void run() {
*<2> is visibility of modified DATA guaranteed?*
}
}
);
e.g。 在一些线程内
...
SwingUtilities.invokeAndWait(
new Runnable() {
@Override
public void run() {
...
*<1> change some DATA*
}
}
);
*<2> is visibility of modified DATA guaranteed?*
答案 0 :(得分:1)
简而言之:是的,在调用invokeLater
/ invokeAndWait
的线程的动作与由此提交的runnable的EDT上的操作之间存在发生之前的关系。没有它,整个API的理智将受到威胁。
不幸的是,任何确认这一点的权威来源都很难找到。关于Swing和并发的很多东西都会发生这种情况。
有关更多信息,请参阅 trashgod 的this answer,这是一位长期的Swing大师。