我最近了解到,Sun / Oracle的最新指南指出,在EDT之外,不得调用任何Swing对象(包括构造函数)的Swing方法。
相同的严格标准也适用于所有“可视” AWT类吗?如果不是,那么它们的规则是什么?
后来
re Swing和EDT:2009年的讨论。
http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-swing-components-on-the-edt.html
引用:
“除了实际的线程安全以及相关的问题,例如可见性和
同步,我认为是软件问题。秋千组件
通常会有某种类型的“听众”,而这些听众旨在
在EDT上执行。
由于这些监听器是异步的,并且可以响应事件(例如
属性更改),您可能会触发这些监听器
构造您的GUI。结果是一些听众
在主线程中构建时在EDT上执行,并且
一些监听器可能也在其他线程上运行(因为
侦听器感到困惑,并在错误的线程上触发)。结果是
巨大的不可预测的混乱。”
也许他们不知道他们在说什么...但是目前,我正在采取一种“安全胜于遗憾”的方法。同样,位于http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html的Potochkin似乎认为我们熟悉后来的更严格的规则
最佳答案
多线程Java程序中的正确同步取决于Memory Consistency Properties中总结的事前发生关系。 AWT组件旨在实现线程安全,并在java.awt.Component
中的专用锁对象上进行同步。从历史角度看注释:
private transient Object objectLock = new Object();
尽管这对于简单程序可能已足够,但是需要更复杂的程序依赖于此实现细节的知识来验证正确的同步。有可能,但是谁愿意为脆弱的AWT GUI做好准备?
其他一些要点:
@Hovercraft引用的article可以追溯到1998年,但是已经反复更新以解决您引用的usenet new memory model中提到的thread之类的问题。
javax.swing
的发展已经脱离了here所述的GUI API承诺,而转向了更加灵活的concurrent programming tools。