From 51aaac8da82eb3a5f973eb9b58fa144dc5b7f3c4 Mon Sep 17 00:00:00 2001 From: chegar Date: Wed, 30 Jun 2010 16:08:47 +0100 Subject: [PATCH] 6926623: Thread clone issues Reviewed-by: hawtin --- src/share/classes/java/lang/Thread.java | 43 ++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/share/classes/java/lang/Thread.java b/src/share/classes/java/lang/Thread.java index c379ec591..7545425e7 100644 --- a/src/share/classes/java/lang/Thread.java +++ b/src/share/classes/java/lang/Thread.java @@ -260,6 +260,10 @@ class Thread implements Runnable { /* 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 @@ class Thread implements Runnable { /* 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 @@ class Thread implements Runnable { * * 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 -- GitLab