提交 5b6b26cd 编写于 作者: C chegar

8044187: Enhancements to InnocuousThread

Reviewed-by: alanb
上级 1dc4e5fd
......@@ -26,7 +26,10 @@
package sun.misc;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.ProtectionDomain;
import java.security.PrivilegedAction;
import java.util.concurrent.atomic.AtomicInteger;
/**
* A thread that has no permissions, is not a member of any user-defined
......@@ -36,22 +39,35 @@ import java.security.ProtectionDomain;
*/
public final class InnocuousThread extends Thread {
private static final Unsafe UNSAFE;
private static final ThreadGroup THREADGROUP;
private static final ThreadGroup INNOCUOUSTHREADGROUP;
private static final AccessControlContext ACC;
private static final long THREADLOCALS;
private static final long INHERITABLETHREADLOCALS;
private static final long INHERITEDACCESSCONTROLCONTEXT;
private static final AtomicInteger threadNumber = new AtomicInteger(1);
public InnocuousThread(Runnable target) {
super(THREADGROUP, target, "anInnocuousThread");
this(INNOCUOUSTHREADGROUP, target,
"InnocuousThread-" + threadNumber.getAndIncrement());
}
public InnocuousThread(Runnable target, String name) {
this(INNOCUOUSTHREADGROUP, target, name);
}
private InnocuousThread(ThreadGroup group, Runnable target, String name) {
super(group, target, name);
UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC);
eraseThreadLocals();
}
// always report system class loader, or null
private ClassLoader contextClassLoader = ClassLoader.getSystemClassLoader();
@Override
public ClassLoader getContextClassLoader() {
// always report system class loader
return ClassLoader.getSystemClassLoader();
return contextClassLoader;
}
@Override
......@@ -61,7 +77,10 @@ public final class InnocuousThread extends Thread {
@Override
public void setContextClassLoader(ClassLoader cl) {
throw new SecurityException("setContextClassLoader");
if (cl == null)
contextClassLoader = null;
else
throw new SecurityException("setContextClassLoader");
}
// ensure run method is run only once
......@@ -113,7 +132,10 @@ public final class InnocuousThread extends Thread {
break;
group = parent;
}
THREADGROUP = new ThreadGroup(group, "InnocuousThreadGroup");
final ThreadGroup root = group;
INNOCUOUSTHREADGROUP = AccessController.doPrivileged(
(PrivilegedAction<ThreadGroup>) () ->
{ return new ThreadGroup(root, "InnocuousThreadGroup"); });
} catch (Exception e) {
throw new Error(e);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册