首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SunToolkit.awtLock:接受这样一个锁的代码是否需要在EDT上调用

SunToolkit.awtLock:接受这样一个锁的代码是否需要在EDT上调用
EN

Stack Overflow用户
提问于 2013-04-16 11:32:40
回答 1查看 670关注 0票数 8

我正在调查一个死锁,并在线程转储中看到了下面的内容

代码语言:javascript
复制
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XRobotPeer.setup(Native Method)
- locked <0x00000000a633fbd0> (a java.lang.Class for sun.awt.X11.XRobotPeer)
at sun.awt.X11.XRobotPeer.<init>(XRobotPeer.java:24)
at sun.awt.X11.XToolkit.createRobot(XToolkit.java:683)
at java.awt.Robot.init(Robot.java:119)
at java.awt.Robot.<init>(Robot.java:77)

这是由调用Robot robot = new Robot();引起的。

这个调用需要一个锁(SunToolkit.awtLock),我想知道还有谁在使用该锁,如果我将new Robot()调用移到EDT,是否会更好。这个名称表示它是由单线程的AWT使用的。如果EDT上的某些东西也使用了这个锁(例如一个Swing组件),那么当我在EDT上创建Robot时,我命中死锁的可能性就会增加。

另一方面,正如在this question中所讨论的,许多Robot方法的设计都是为了在EDT上调用时抛出异常。如果您最好在EDT上创建Robot实例,这将使您感到很烦人。

Toolkit.getDefaultToolkit().getScreenResolution()也存在同样的问题,因此不需要只关注Robot类:

代码语言:javascript
复制
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XToolkit.getScreenResolution(XToolkit.java:999)

所以我想澄清的是:

  • 那个锁的利害关系人是谁?
  • 该锁的引入可能只是为了使Swing/AWT多线程(或至少更多一些线程安全),但推荐的方法是避免在另一个线程上使用该锁,而不是EDT?
  • 是否有任何官方的Oracle/Sun文档(类似于Swing中的并发性指南)可以供我参考?我的谷歌技术让我失望了。
EN

回答 1

Stack Overflow用户

发布于 2013-05-07 09:26:19

参见SunToolkit.java的源代码:http://www.docjar.com/html/api/sun/awt/SunToolkit.java.html在第208行中解释了AWT_LOCK的用途。

这是一段节选,以防页面消失:

/** * AWT锁通常仅在Unix平台上使用,以同步对Xlib、OpenGL等的*访问。然而,这些方法是在SunToolkit中实现的,以便可以从共享代码(例如,从OGL管道中调用)或从X11管道调用它们,而不管是否正在使用* XToolkit或MToolkit。在awt.h中定义了本机宏*(如AWT_LOCK),因此如果这些*方法的实现发生了更改,请确保它与本机宏兼容。**注:应该使用下列方法(awtLock()、awtUnlock()等)来代替:*getAWTLock (getAWTLock()) {*.}*,通过专门分解这些方法,我们可以更改这些方法的*实现(例如,使用更高级的锁定*机制),而不影响调用代码。**示例用法:*私有void doStuffWithXlib() {* assert !SunToolkit.isAWTLockHeldByCurrentThread();* SunToolkit.awtLock();*尝试{*. XlibWrapper.XDoStuff();*}最后{* SunToolkit.awtUnlock();*}*} */

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16035933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档