changeset 3367:4cd8718d4548

7011442: AppletClassLoader.java needs to avoid spurious wakeup Reviewed-by: anthony
author dcherepanov
date Thu, 20 Jan 2011 14:29:03 +0300
parents 1bb32dc775c8
children 4c9a9871830f
files src/share/classes/sun/applet/AppletClassLoader.java
diffstat 1 files changed, 13 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/sun/applet/AppletClassLoader.java	Thu Jan 20 14:28:40 2011 +0300
+++ b/src/share/classes/sun/applet/AppletClassLoader.java	Thu Jan 20 14:29:03 2011 +0300
@@ -663,13 +663,15 @@
                     // set the context class loader to the AppletClassLoader.
                     creatorThread.setContextClassLoader(AppletClassLoader.this);
 
-                    synchronized(creatorThread.syncObject)  {
-                        creatorThread.start();
-                        try {
-                            creatorThread.syncObject.wait();
-                        } catch (InterruptedException e) { }
-                        appContext = creatorThread.appContext;
-                    }
+                    creatorThread.start();
+                    try {
+                        synchronized(creatorThread.syncObject) {
+                            while (!creatorThread.created) {
+                                creatorThread.syncObject.wait();
+                            }
+                        }
+                    } catch (InterruptedException e) { }
+                    appContext = creatorThread.appContext;
                     return null;
                 }
             });
@@ -854,14 +856,16 @@
 class AppContextCreator extends Thread  {
     Object syncObject = new Object();
     AppContext appContext = null;
+    volatile boolean created = false;
 
     AppContextCreator(ThreadGroup group)  {
         super(group, "AppContextCreator");
     }
 
     public void run()  {
-        synchronized(syncObject)  {
-            appContext = SunToolkit.createNewAppContext();
+        appContext = SunToolkit.createNewAppContext();
+        created = true;
+        synchronized(syncObject) {
             syncObject.notifyAll();
         }
     } // run()