JDK-4913324 : Deadlock when using two event queues
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 5.0,5.0u7
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux,solaris_9
  • CPU: x86,sparc
  • Submitted: 2003-08-27
  • Updated: 2009-12-16
  • Resolved: 2009-12-16
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b78Fixed
Related Reports
Duplicate :  
Relates :  
Relates :  
Description

Name: dmR10075			Date: 08/27/2003


Download and install j2ee 1.3.1 with tutorial, start Tutorial, after
creation of first Bean you will get the following deadlock. Reproduced
using 1.5.0b16, on Linux/XAWT. This seems to be a generic problem - the
code which causes a deadlock can as well deadlock with any other
toolkit.

Java stack information for the threads listed above:
===================================================
"AWT-EventQueue-1":
        at java.awt.EventQueue.postEventPrivate(EventQueue.java:188)
        - waiting to lock <0x4392b3b8> (a java.awt.EventQueue)
        at java.awt.EventQueue.postEvent(EventQueue.java:175)
        at sun.awt.PostEventQueue.flush(SunToolkit.java:956)
        - locked <0x43925f70> (a sun.awt.PostEventQueue)
        at sun.awt.SunToolkit.flushPendingEvents(SunToolkit.java:510)
        at java.awt.EventQueue.getNextEvent(EventQueue.java:331)
        at java.awt.EventQueue.pop(EventQueue.java:621)
        - locked <0x43daded8> (a
com.sun.enterprise.tools.deployment.ui.utils.UIEventQueue)
        - locked <0x439fe860> (a
com.sun.enterprise.tools.deployment.ui.utils.UIEventQueue)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIEventQueue.remove(UIEventQueue.java:173)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIDialog.show(UIDialog.java:214)
        at
com.sun.enterprise.tools.deployment.ui.utils.Wizard.show(Wizard.java:486)
        at
com.sun.enterprise.tools.deployment.ui.ejb.NewEjbWizard.<init>(NewEjbWizard.java:102)
        at
com.sun.enterprise.tools.deployment.ui.DeployToolWindow.newEjbJarAction(DeployToolWindow.java:1595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIActionDispatcher.invoke(UIActionDispatcher.java:258)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIActionDispatcher.invoke(UIActionDispatcher.java:276)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIActionDispatcher.actionPerformed(UIActionDispatcher.java:296)
        at
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1832)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIMenu$UIMenuItem.fireActionPerformed(UIMenu.java:216)
        at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2150)
        at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at
javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.AbstractButton.doClick(AbstractButton.java:302)
        at
javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1000)
        at
javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1041)
        at java.awt.Component.processMouseEvent(Component.java:5419)
        at
javax.swing.JComponent.processMouseEvent(JComponent.java:2920)
        at java.awt.Component.processEvent(Component.java:5216)
        at java.awt.Container.processEvent(Container.java:1936)
        at java.awt.Component.dispatchEventImpl(Component.java:3919)
        at java.awt.Container.dispatchEventImpl(Container.java:1994)
        at java.awt.Component.dispatchEvent(Component.java:3770)
        at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3996)
        at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:3711)
        at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:3641)
        at java.awt.Container.dispatchEventImpl(Container.java:1980)
        at java.awt.Window.dispatchEventImpl(Window.java:1729)
        at java.awt.Component.dispatchEvent(Component.java:3770)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at
com.sun.enterprise.tools.deployment.ui.utils.UIEventQueue.dispatchEvent(UIEventQueue.java:214)
        at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:214)
        at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at
java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
"AWT-XAWT":
        at java.awt.EventQueue.wakeup(EventQueue.java:850)
        - waiting to lock <0x439fe860> (a
com.sun.enterprise.tools.deployment.ui.utils.UIEventQueue)
        at java.awt.EventQueue.wakeup(EventQueue.java:853)
        - locked <0x4392b3b8> (a java.awt.EventQueue)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at sun.awt.SunToolkit.wakeupEventQueue(SunToolkit.java:265)
        at sun.awt.PostEventQueue.postEvent(SunToolkit.java:977)
        at sun.awt.SunToolkit.postEvent(SunToolkit.java:497)
        at sun.awt.X11.XWindow.postEvent(XWindow.java:303)
        at
sun.awt.X11.XWindowPeer.handleWindowFocusOut(XWindowPeer.java:245)
        at
sun.awt.X11.XWindowPeer.handleFocusEvent(XWindowPeer.java:340)
        at
sun.awt.X11.XDecoratedPeer.handleFocusEvent(XDecoratedPeer.java:107)
        at sun.awt.X11.XWindowPeer.dispatchEvent(XWindowPeer.java:352)
        at
sun.awt.X11.XBaseWindow.dispatchToWindow(XBaseWindow.java:745)
        at sun.awt.X11.XToolkit.dispatchEvent(XToolkit.java:375)
        at sun.awt.X11.XToolkit.run(XToolkit.java:463)
        at sun.awt.X11.XToolkit.run(XToolkit.java:419)
        at java.lang.Thread.run(Thread.java:549)
 
Found 1 deadlock.


======================================================================

Comments
SUGGESTED FIX Provide a single lock for EQ operations (push/pop, postEvent, get/peekEvent, etc.)
27-11-2009

EVALUATION Reg tests java/awt/EventQueue/PushPopDeadlock and java/awt/EventQueue/PushPopSystemQueue fail due to deadlock with blocked EQ and applet threads. Thread dump attached (log1). The failures look very close to this CR.
30-09-2009

EVALUATION The test from 4943231 doesn't represent the purpose of such technique but there is a long discussion about this one and some related things: http://www.netbeans.org/issues/show_bug.cgi?id=90590 One of the cases when it's worth to push() and pop() is to prevent whole application from being terminated. Another case is a workaround for modal blocker. See http://www.roseindia.net/javatutorials/WaitCursorEventQueue.shtml
24-01-2008

EVALUATION Name: osR10079 Date: 08/28/2003 The problem is as follows: The problem is reproducible when we have at leats three EventQueue in queue's stack (EQ0, EQ1,EQ2). User calls EventQueue.pop() on EDT.This method gets lock on EQ1, and than on EQ2 and calls getNextEvent() which, in turn, calls SunToolkit.flushPendingEvents() which tries to get lock on EQ0 (SunToolkit works with event queues through defaul event queue). So, we have the following lock sequence - EQ1, EQ2, EQ0. At the same time our peers post event using SunToolkit.postEvent() which calls EventQueue.wakeup() (on EQ0 of course). So, wakeup() tries to get lock on EQ0, than on EQ1 and than on EQ2. Lock sequence is EQ0, EQ1, EQ2. So, we have a different lock sequences which cause a deadlock. ###@###.### 2003-8-28 ======================================================================
28-08-2003