6926623: Thread clone issues
authorchegar
Wed, 30 Jun 2010 16:08:47 +0100
changeset 6866 4197c5af089d
parent 6864 192093b11c67
child 6867 3e770ac705b6
6926623: Thread clone issues Reviewed-by: hawtin
jdk/src/share/classes/java/lang/Thread.java
--- a/jdk/src/share/classes/java/lang/Thread.java	Mon Jun 28 13:07:23 2010 -0700
+++ b/jdk/src/share/classes/java/lang/Thread.java	Wed Jun 30 16:08:47 2010 +0100
@@ -260,6 +260,10 @@
     /* Remembered Throwable from stop before start */
     private Throwable throwableFromStop;
 
+    /* Whether or not the Thread has been completely constructed;
+     * init or clone method has successfully completed */
+    private volatile Thread me;    // null
+
     /**
      * Returns a reference to the currently executing thread object.
      *
@@ -411,6 +415,43 @@
 
         /* Set thread ID */
         tid = nextThreadID();
+
+        this.me = this;
+    }
+
+    /**
+     * Returns a clone if the class of this object is {@link Cloneable Cloneable}.
+     *
+     * @return  a clone if the class of this object is {@code Cloneable}
+     *
+     * @throws  CloneNotSupportedException
+     *          if this method is invoked on a class that does not
+     *          support {@code Cloneable}
+     */
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
+        Thread t;
+        synchronized(this) {
+            t = (Thread) super.clone();
+
+            t.tid = nextThreadID();
+            t.parkBlocker = null;
+            t.blocker = null;
+            t.blockerLock = new Object();
+            t.threadLocals = null;
+
+            group.checkAccess();
+            group.addUnstarted();
+            t.setPriority(priority);
+
+            final Thread current = Thread.currentThread();
+            if (current.inheritableThreadLocals != null)
+                t.inheritableThreadLocals =
+                    ThreadLocal.createInheritedMap(current.inheritableThreadLocals);
+        }
+
+        t.me = t;
+        return t;
     }
 
     /**
@@ -672,7 +713,7 @@
          *
          * A zero status value corresponds to state "NEW".
          */
-        if (threadStatus != 0)
+        if (threadStatus != 0 || this != me)
             throw new IllegalThreadStateException();
 
         /* Notify the group that this thread is about to be started