mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-21 15:55:15 +00:00
6926623: Thread clone issues
Reviewed-by: hawtin
This commit is contained in:
parent
833dfdcbf2
commit
0a47db80ed
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user