1
4
告诫
尽管我以上的回答我通常
不
直接访问EDT外部的模型。正如Carl提到的,如果执行更新的操作是通过某个GUI操作调用的,那么不需要执行任何同步,因为EDT已经在运行代码。但是,如果我希望执行一些后台处理,这将导致模型被更改,我通常会调用
|
2
4
是的,它是错误的;除非两个线程都同步 在同一个对象上或使用一些其他内存屏障,如JMM定义的volatile 一个或另一个可以观察到不一致的内存内容。时期。故事的结尾。违反这一点可能会对某些甚至许多体系结构产生影响,但最终会让您感到痛苦。 这里的问题是,除了您提供模型的一些例外情况,比如Adamski所提到的,Swing代码不会在任何东西上进行同步。 值得注意的是,JMM(Java内存模型)在Java5中以非常重要的方式与JSR-133发生了改变,因此J4和早期JVM的行为可能会产生不同于J5和以后的结果。正如您所期望的,修改后的JMM有了很大的改进。 |
3
2
一般来说,秋千不仅不安全,而且对线有敌意。然而,除了Swing文本之外,大多数模型都是线程无关的。这意味着,只要使用标准线程保护,就可以在任何线程中使用模型。Swing文本是一种线程安全的尝试,但失败了,实际上是线程敌对的。只使用
通常的建议是在EDT之外运行可能长时间运行(通常是阻塞)的任务。然而,线程是困难的。
线程错误是困难的。您可能在您的机器上看不到它们,但客户可能会看到。可能是由于JRE的后期版本中的优化导致了错误的出现。线程错误很难跟踪。因此,要保守。即使短暂地阻止EDT也比讨厌的错误要好。 |
4
1
因为我自己创建了模型(这可以是非常简单的事情,比如一个带有getter/setter和propertychangesupport的字符串),所以如果需要,我可以使访问器同步。由于线程争用之类的原因,我很少遇到不稳定的行为。 |
5
1
其他人已经提到
您可以做一些事情来检测错误。如果将方法设计为仅从 事件调度线程 ,对其进行保护,以便当有人试图从另一线程访问时失败:
对在主应用程序线程上进行大量设置的现有应用程序进行这种方法的改造可能意味着一些重大的重构。 |
6
0
这是一个很好的问题,软件猴子有正确的答案。如果要执行有效的线程,必须完全理解 Java Memory Model (JMM)。注意,Java内存模型 已经改变 有了JSR-133,很多旧的线程示例都是错误的。例如,volatile关键字已经从几乎无用变为现在几乎和synchronized关键字一样强制。 此外,我们现在拥有真正的、无所不在的多核CPU,这意味着真正的多线程。直到几年前,多线程只是在单核CPU上伪造,这就是为什么有这么多坏的示例代码存在的原因。它曾经起作用。现在不会了。 说真的,如果乔舒亚·布洛克能弄错的话,就要小心行事。这是复杂的事情(是的,他的代码是错误的。使这个变量易变,它在所有情况下都能工作。
哦,是的,阿达姆斯基说得对。使用A
在EDT上调用的代码示例,最有可能是在ActionListener或其他(psuedCode)中:
|