United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 6949712 regression: deadlock in JNLP2ClassLoader
6949712 : regression: deadlock in JNLP2ClassLoader

Details
Type:
Bug
Submit Date:
2010-05-05
Status:
Closed
Updated Date:
2010-09-08
Project Name:
JDK
Resolved Date:
2010-06-19
Component:
deploy
OS:
windows
Sub-Component:
plugin
CPU:
x86
Priority:
P2
Resolution:
Fixed
Affected Versions:
6u19
Fixed Versions:
6u21

Related Reports
Relates:

Sub Tasks

Description
Load this applet, reload browser a few times, sometimes you will get a deadlock and applet won't be displayed:

http://spbweb.russia.sun.com/~in81039/custom/Reversi2/reversi2.html


Found one Java-level deadlock:
=============================
"JFXIC-Ping Thread":
  waiting to lock monitor 0x033b23f4 (object 0x236214f8, a sun.plugin2.applet.JNLP2ClassLoader),
  which is held by "AWT-EventQueue-6"
"AWT-EventQueue-6":
  waiting to lock monitor 0x0c94359c (object 0x236215b8, a sun.plugin2.applet.JNLP2ClassLoader),
  which is held by "Thread-29"
"Thread-29":
  waiting to lock monitor 0x033b23f4 (object 0x236214f8, a sun.plugin2.applet.JNLP2ClassLoader),
  which is held by "AWT-EventQueue-6"

Java stack information for the threads listed above:
===================================================
"JFXIC-Ping Thread":
	at com.sun.javafx.eula.Ping.getVisitorID(Unknown Source)
	at com.sun.javafx.eula.Ping.access$000(Unknown Source)
	at com.sun.javafx.eula.Ping$1.run(Unknown Source)
"AWT-EventQueue-6":
	at java.lang.ClassLoader.loadClass(Unknown Source)
	- waiting to lock <0x236215b8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.JNLP2ClassLoader.findClass(JNLP2ClassLoader.java:340)
	- locked <0x236214f8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	- locked <0x236214f8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at com.sun.javafx.runtime.adapter.AppletStartupRoutine.run(Unknown Source)
	at com.sun.javafx.tk.swing.SwingToolkit$StartupRoutine.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
"Thread-29":
	at java.lang.ClassLoader.loadClass(Unknown Source)
	- waiting to lock <0x236214f8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	- locked <0x236215b8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(Unknown Source)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.defineClassHelper(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.access$100(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
	at sun.plugin2.applet.JNLP2ClassLoader.findClass(JNLP2ClassLoader.java:320)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	- locked <0x236215b8> (a sun.plugin2.applet.JNLP2ClassLoader)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.JNLP2Manager$4.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Found 1 deadlock.

                                    

Comments
EVALUATION

I have tested using the latest JRE 6u21 nightly build, I can't reproduce the hanging.
                                     
2010-05-11
EVALUATION

this seems to be related to the following code in JNLP2Classloader:

  synchronized (this) { // redundant?
                if (!processingException && needToApplyWorkaround() &&
                        _delegatingClassLoader != null) {
                    // workaround to allow runtime JARs and applet JARs to be
                    // loaded by different class loader
                    processingException = true;
                    try {
			/* We guard against endless recursion but could,
			 * in theory, still face deadlock by locking out of the
			 * normal hierarchical order. The risk of deadlock appears
			 * low in this narrow case. This is a temporary workaround
			 * that should be removed soon.
			 */
                        return _delegatingClassLoader.loadClass(name);
                    } finally {
                        processingException = false;
                    }
                }
            }


Is the first synchronzied(this) really needed ?
                                     
2010-05-05



Hardware and Software, Engineered to Work Together