JDK-7002839 : Static initialization deadlock between sun.awt.Win32GraphicsEnvironment and sun.awt.windows.WToolkit
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 6,7
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2010-11-25
  • Updated: 2012-02-02
  • Resolved: 2011-05-24
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 b140Fixed
Related Reports
Relates :  
Description
Stress test running several tests in separate threads hangs with stack trace below.

The problem is caused by circular dependency of static constructors of sun.awt.Win32GraphicsEnvironment and sun.awt.windows.WToolkit: first calls WToolkit.loadLibraries() and second one Win32GraphicsEnvironment.init(). This may cause deadlock if AWT is called from multiple threads.

The bug is Windows only.

"Thread-337" prio=6 tid=0x4e8db400 nid=0x1e788 in Object.wait() [0x4c8df000]
   java.lang.Thread.State: RUNNABLE
        at sun.awt.Win32GraphicsEnvironment.<clinit>(Win32GraphicsEnvironment.java:69)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
        - locked <0x05aed0a8> (a java.lang.Class for java.awt.GraphicsEnvironment)
        at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1152)
        at javasoft.sqe.tests.api.java.awt.java2d.image.BufferedImage.GetTest.testCase40(GetTest.java:1728)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:613)
        at javasoft.sqe.jck.lib.MultiTest.run(MultiTest.java:137)
        at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:742)
        at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)

"Thread-308" prio=6 tid=0x4e8dd000 nid=0x1cac8 in Object.wait() [0x4b64e000]
   java.lang.Thread.State: RUNNABLE
        at sun.awt.windows.WToolkit.<clinit>(WToolkit.java:108)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at java.awt.Toolkit$2.run(Toolkit.java:863)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:855)
        - locked <0x05ad5a90> (a java.lang.Class for java.awt.Toolkit)
        at java.awt.Image.getScaledInstance(Image.java:177)
        at javasoft.sqe.tests.api.java.awt.java2d.image.BufferedImage.GetTest.testCase11(GetTest.java:477)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:613)
        at javasoft.sqe.jck.lib.MultiTest.run(MultiTest.java:137)
        at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:742)
        at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)

Comments
SUGGESTED FIX http://sa.sfbay.sun.com/projects/awt_data/7/7002839.1/
10-03-2011

EVALUATION Two test in paraller calls awt api which leads to mutual lock for two threads trying to static-init platform-specific classes. I'd say that the by the time the WToolkit class is needed/first used we should already have GE initialized.
03-03-2011