我正在调查一个死锁,并在线程转储中看到了下面的内容
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类:
at sun.awt.SunToolkit.awtLock(SunToolkit.java:229)
at sun.awt.X11.XToolkit.getScreenResolution(XToolkit.java:999)所以我想澄清的是:
发布于 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();*}*} */
https://stackoverflow.com/questions/16035933
复制相似问题