This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/8.5.x by this push:
     new f8a10090ca Refactor to reduce native calls
f8a10090ca is described below

commit f8a10090ca893168f7e805fe2eefc1203ed08eea
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Feb 24 14:59:43 2023 +0000

    Refactor to reduce native calls
    
    Thread.currentThread() is a native call so ensure it is only used once
    per method, caching the result in a local variable if it is used more
    than once.
    Note: some instances of caching aren't strictly necessary but are a
    side-effect of the refactoring.
---
 java/org/apache/catalina/ant/ValidatorTask.java    |  7 +-
 .../core/JreMemoryLeakPreventionListener.java      |  7 +-
 java/org/apache/catalina/core/StandardContext.java | 14 ++--
 java/org/apache/catalina/core/StandardServer.java  |  5 +-
 .../catalina/ha/context/ReplicatedContext.java     |  7 +-
 .../apache/catalina/ha/session/DeltaManager.java   |  7 +-
 .../apache/catalina/ha/session/DeltaSession.java   |  7 +-
 java/org/apache/catalina/loader/WebappLoader.java  |  7 +-
 java/org/apache/catalina/realm/JAASRealm.java      | 10 +--
 java/org/apache/catalina/realm/JNDIRealm.java      | 80 +++++++++++++---------
 .../apache/catalina/servlets/DefaultServlet.java   | 14 ++--
 .../tribes/membership/McastServiceImpl.java        | 38 +++++-----
 .../catalina/valves/StuckThreadDetectionValve.java |  5 +-
 java/org/apache/coyote/AsyncStateMachine.java      | 13 ++--
 java/org/apache/jasper/JspC.java                   |  9 +--
 .../apache/jasper/compiler/ELFunctionMapper.java   |  5 +-
 .../apache/jasper/compiler/JspDocumentParser.java  | 15 ++--
 .../apache/jasper/compiler/TagPluginManager.java   | 15 ++--
 java/org/apache/naming/ContextBindings.java        | 10 +--
 .../tomcat/util/descriptor/tld/TldParser.java      | 13 ++--
 .../tomcat/util/security/PrivilegedGetTccl.java    | 15 +++-
 .../tomcat/util/security/PrivilegedSetTccl.java    |  1 +
 .../tomcat/util/threads/ThreadPoolExecutor.java    |  6 +-
 .../tomcat/websocket/AsyncChannelGroupUtil.java    |  8 +--
 .../tomcat/websocket/server/WsFrameServer.java     | 14 ++--
 .../TestWebappClassLoaderExecutorMemoryLeak.java   | 11 ++-
 .../catalina/startup/TestTomcatClassLoader.java    |  7 +-
 .../org/apache/juli/TestClassLoaderLogManager.java |  7 +-
 28 files changed, 200 insertions(+), 157 deletions(-)

diff --git a/java/org/apache/catalina/ant/ValidatorTask.java 
b/java/org/apache/catalina/ant/ValidatorTask.java
index fbe360dd0a..81d3997bc4 100644
--- a/java/org/apache/catalina/ant/ValidatorTask.java
+++ b/java/org/apache/catalina/ant/ValidatorTask.java
@@ -81,8 +81,9 @@ public class ValidatorTask extends BaseRedirectorHelperTask {
         }
 
         // Commons-logging likes having the context classloader set
-        ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
-        
Thread.currentThread().setContextClassLoader(ValidatorTask.class.getClassLoader());
+        Thread currentThread = Thread.currentThread();
+        ClassLoader oldCL = currentThread.getContextClassLoader();
+        
currentThread.setContextClassLoader(ValidatorTask.class.getClassLoader());
 
         // Called through trusted manager interface. If running under a
         // SecurityManager assume that untrusted applications may be deployed.
@@ -100,7 +101,7 @@ public class ValidatorTask extends BaseRedirectorHelperTask 
{
                 handleErrorOutput("Validation failure: " + e);
             }
         } finally {
-            Thread.currentThread().setContextClassLoader(oldCL);
+            currentThread.setContextClassLoader(oldCL);
             closeRedirector();
         }
 
diff --git a/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java 
b/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
index 22b55b8508..a2d6b57ea0 100644
--- a/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
+++ b/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
@@ -262,12 +262,13 @@ public class JreMemoryLeakPreventionListener implements 
LifecycleListener {
                 DriverManager.getDrivers();
             }
 
-            ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
+            Thread currentThread = Thread.currentThread();
+            ClassLoader loader = currentThread.getContextClassLoader();
 
             try {
                 // Use the system classloader as the victim for all this
                 // ClassLoader pinning we're about to do.
-                
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
+                
currentThread.setContextClassLoader(ClassLoader.getSystemClassLoader());
 
                 /*
                  * Several components end up calling: 
sun.awt.AppContext.getAppContext()
@@ -463,7 +464,7 @@ public class JreMemoryLeakPreventionListener implements 
LifecycleListener {
                 }
 
             } finally {
-                Thread.currentThread().setContextClassLoader(loader);
+                currentThread.setContextClassLoader(loader);
             }
         }
     }
diff --git a/java/org/apache/catalina/core/StandardContext.java 
b/java/org/apache/catalina/core/StandardContext.java
index aaadf45171..dbd0afc5f8 100644
--- a/java/org/apache/catalina/core/StandardContext.java
+++ b/java/org/apache/catalina/core/StandardContext.java
@@ -5528,12 +5528,13 @@ public class StandardContext extends ContainerBase 
implements Context, Notificat
             webApplicationClassLoader = loader.getClassLoader();
         }
 
+        Thread currentThread = Thread.currentThread();
         if (originalClassLoader == null) {
             if (usePrivilegedAction) {
-                PrivilegedAction<ClassLoader> pa = new PrivilegedGetTccl();
+                PrivilegedAction<ClassLoader> pa = new 
PrivilegedGetTccl(currentThread);
                 originalClassLoader = AccessController.doPrivileged(pa);
             } else {
-                originalClassLoader = 
Thread.currentThread().getContextClassLoader();
+                originalClassLoader = currentThread.getContextClassLoader();
             }
         }
 
@@ -5546,10 +5547,10 @@ public class StandardContext extends ContainerBase 
implements Context, Notificat
         ThreadBindingListener threadBindingListener = 
getThreadBindingListener();
 
         if (usePrivilegedAction) {
-            PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(webApplicationClassLoader);
+            PrivilegedAction<Void> pa = new PrivilegedSetTccl(currentThread, 
webApplicationClassLoader);
             AccessController.doPrivileged(pa);
         } else {
-            
Thread.currentThread().setContextClassLoader(webApplicationClassLoader);
+            currentThread.setContextClassLoader(webApplicationClassLoader);
         }
         if (threadBindingListener != null) {
             try {
@@ -5579,11 +5580,12 @@ public class StandardContext extends ContainerBase 
implements Context, Notificat
             }
         }
 
+        Thread currentThread = Thread.currentThread();
         if (usePrivilegedAction) {
-            PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(originalClassLoader);
+            PrivilegedAction<Void> pa = new PrivilegedSetTccl(currentThread, 
originalClassLoader);
             AccessController.doPrivileged(pa);
         } else {
-            Thread.currentThread().setContextClassLoader(originalClassLoader);
+            currentThread.setContextClassLoader(originalClassLoader);
         }
     }
 
diff --git a/java/org/apache/catalina/core/StandardServer.java 
b/java/org/apache/catalina/core/StandardServer.java
index 4b986b9d77..e5708390bb 100644
--- a/java/org/apache/catalina/core/StandardServer.java
+++ b/java/org/apache/catalina/core/StandardServer.java
@@ -422,9 +422,10 @@ public final class StandardServer extends 
LifecycleMBeanBase implements Server {
             // undocumented yet - for embedding apps that are around, alive.
             return;
         }
+        Thread currentThread = Thread.currentThread();
         if (getPortWithOffset() == -1) {
             try {
-                awaitThread = Thread.currentThread();
+                awaitThread = currentThread;
                 while (!stopAwait) {
                     try {
                         Thread.sleep(10000);
@@ -448,7 +449,7 @@ public final class StandardServer extends 
LifecycleMBeanBase implements Server {
         }
 
         try {
-            awaitThread = Thread.currentThread();
+            awaitThread = currentThread;
 
             // Loop waiting for a connection and a valid command
             while (!stopAwait) {
diff --git a/java/org/apache/catalina/ha/context/ReplicatedContext.java 
b/java/org/apache/catalina/ha/context/ReplicatedContext.java
index 1eb12975c6..c9f3dfa733 100644
--- a/java/org/apache/catalina/ha/context/ReplicatedContext.java
+++ b/java/org/apache/catalina/ha/context/ReplicatedContext.java
@@ -106,13 +106,14 @@ public class ReplicatedContext extends StandardContext 
implements MapOwner {
         if (loader != null) {
             classLoader = loader.getClassLoader();
         }
+        Thread currentThread = Thread.currentThread();
         if ( classLoader == null ) {
-            classLoader = Thread.currentThread().getContextClassLoader();
+            classLoader = currentThread.getContextClassLoader();
         }
-        if ( classLoader == Thread.currentThread().getContextClassLoader() ) {
+        if ( classLoader == currentThread.getContextClassLoader() ) {
             return new ClassLoader[] {classLoader};
         } else {
-            return new ClassLoader[] 
{classLoader,Thread.currentThread().getContextClassLoader()};
+            return new ClassLoader[] 
{classLoader,currentThread.getContextClassLoader()};
         }
     }
 
diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java 
b/java/org/apache/catalina/ha/session/DeltaManager.java
index 0f8ad8ff22..403a7e9711 100644
--- a/java/org/apache/catalina/ha/session/DeltaManager.java
+++ b/java/org/apache/catalina/ha/session/DeltaManager.java
@@ -1216,11 +1216,12 @@ public class DeltaManager extends ClusterManagerBase{
      *            requesting node
      */
     protected void messageReceived(SessionMessage msg, Member sender) {
-        ClassLoader contextLoader = 
Thread.currentThread().getContextClassLoader();
+        Thread currentThread = Thread.currentThread();
+        ClassLoader contextLoader = currentThread.getContextClassLoader();
         try {
 
             ClassLoader[] loaders = getClassLoaders();
-            Thread.currentThread().setContextClassLoader(loaders[0]);
+            currentThread.setContextClassLoader(loaders[0]);
             if (log.isDebugEnabled()) {
                 log.debug(sm.getString("deltaManager.receiveMessage.eventType",
                         getName(), msg.getEventTypeString(), sender));
@@ -1261,7 +1262,7 @@ public class DeltaManager extends ClusterManagerBase{
         } catch (Exception x) {
             
log.error(sm.getString("deltaManager.receiveMessage.error",getName()), x);
         } finally {
-            Thread.currentThread().setContextClassLoader(contextLoader);
+            currentThread.setContextClassLoader(contextLoader);
         }
     }
 
diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java 
b/java/org/apache/catalina/ha/session/DeltaSession.java
index e4371321e9..5cd5329783 100644
--- a/java/org/apache/catalina/ha/session/DeltaSession.java
+++ b/java/org/apache/catalina/ha/session/DeltaSession.java
@@ -197,16 +197,17 @@ public class DeltaSession extends StandardSession 
implements Externalizable,Clus
     public void applyDiff(byte[] diff, int offset, int length) throws 
IOException, ClassNotFoundException {
         lockInternal();
         try (ObjectInputStream stream = ((ClusterManager) 
getManager()).getReplicationStream(diff, offset, length)) {
-            ClassLoader contextLoader = 
Thread.currentThread().getContextClassLoader();
+            Thread currentThread = Thread.currentThread();
+            ClassLoader contextLoader = currentThread.getContextClassLoader();
             try {
                 ClassLoader[] loaders = getClassLoaders();
                 if (loaders != null && loaders.length > 0) {
-                    Thread.currentThread().setContextClassLoader(loaders[0]);
+                    currentThread.setContextClassLoader(loaders[0]);
                 }
                 getDeltaRequest().readExternal(stream);
                 getDeltaRequest().execute(this, 
((ClusterManager)getManager()).isNotifyListenersOnReplication());
             } finally {
-                Thread.currentThread().setContextClassLoader(contextLoader);
+                currentThread.setContextClassLoader(contextLoader);
             }
         } finally {
             unlockInternal();
diff --git a/java/org/apache/catalina/loader/WebappLoader.java 
b/java/org/apache/catalina/loader/WebappLoader.java
index 468605f427..f05a2cbf05 100644
--- a/java/org/apache/catalina/loader/WebappLoader.java
+++ b/java/org/apache/catalina/loader/WebappLoader.java
@@ -290,16 +290,15 @@ public class WebappLoader extends LifecycleMBeanBase
     @Override
     public void backgroundProcess() {
         if (reloadable && modified()) {
+            Thread currentThread = Thread.currentThread();
             try {
-                Thread.currentThread().setContextClassLoader
-                    (WebappLoader.class.getClassLoader());
+                
currentThread.setContextClassLoader(WebappLoader.class.getClassLoader());
                 if (context != null) {
                     context.reload();
                 }
             } finally {
                 if (context != null && context.getLoader() != null) {
-                    Thread.currentThread().setContextClassLoader
-                        (context.getLoader().getClassLoader());
+                    
currentThread.setContextClassLoader(context.getLoader().getClassLoader());
                 }
             }
         }
diff --git a/java/org/apache/catalina/realm/JAASRealm.java 
b/java/org/apache/catalina/realm/JAASRealm.java
index bb1e9a3017..9c0e120454 100644
--- a/java/org/apache/catalina/realm/JAASRealm.java
+++ b/java/org/apache/catalina/realm/JAASRealm.java
@@ -385,10 +385,12 @@ public class JAASRealm extends RealmBase {
 
             // What if the LoginModule is in the container class loader ?
             ClassLoader ocl = null;
+            Thread currentThread = null;
 
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
 
             try {
@@ -402,8 +404,8 @@ public class JAASRealm extends RealmBase {
                 invocationSuccess = false;
                 return null;
             } finally {
-                if (!isUseContextClassLoader()) {
-                    Thread.currentThread().setContextClassLoader(ocl);
+                if (currentThread != null) {
+                    currentThread.setContextClassLoader(ocl);
                 }
             }
 
diff --git a/java/org/apache/catalina/realm/JNDIRealm.java 
b/java/org/apache/catalina/realm/JNDIRealm.java
index 63026fa99c..5b391ff154 100644
--- a/java/org/apache/catalina/realm/JNDIRealm.java
+++ b/java/org/apache/catalina/realm/JNDIRealm.java
@@ -1143,6 +1143,7 @@ public class JNDIRealm extends RealmBase {
     public Principal authenticate(String username, String credentials) {
 
         ClassLoader ocl = null;
+        Thread currentThread = null;
         JNDIConnection connection = null;
         Principal principal = null;
 
@@ -1152,8 +1153,9 @@ public class JNDIRealm extends RealmBase {
             // running on a JVM that includes a fix for
             // https://bugs.openjdk.java.net/browse/JDK-8273874
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
 
             // Ensure that we have a directory context available
@@ -1215,8 +1217,8 @@ public class JNDIRealm extends RealmBase {
             }
             return null;
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1245,14 +1247,16 @@ public class JNDIRealm extends RealmBase {
         }
 
         ClassLoader ocl = null;
+        Thread currentThread= null;
         try {
             // https://bz.apache.org/bugzilla/show_bug.cgi?id=65553
             // This can move back to open() once it is known that Tomcat must 
be
             // running on a JVM that includes a fix for
             // https://bugs.openjdk.java.net/browse/JDK-8273874
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
 
             if (userPatternArray != null) {
@@ -1303,8 +1307,8 @@ public class JNDIRealm extends RealmBase {
                 return new GenericPrincipal(username, credentials, roles);
             }
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1318,15 +1322,17 @@ public class JNDIRealm extends RealmBase {
     @Override
     public Principal authenticate(String username) {
         ClassLoader ocl = null;
+        Thread currentThread = null;
         try {
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             return super.authenticate(username);
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1341,15 +1347,17 @@ public class JNDIRealm extends RealmBase {
     public Principal authenticate(String username, String clientDigest, String 
nonce, String nc, String cnonce,
             String qop, String realm, String md5a2) {
         ClassLoader ocl = null;
+        Thread currentThread = null;
         try {
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             return super.authenticate(username, clientDigest, nonce, nc, 
cnonce, qop, realm, md5a2);
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1363,15 +1371,17 @@ public class JNDIRealm extends RealmBase {
     @Override
     public Principal authenticate(X509Certificate[] certs) {
         ClassLoader ocl = null;
+        Thread currentThread = null;
         try {
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             return super.authenticate(certs);
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1385,15 +1395,17 @@ public class JNDIRealm extends RealmBase {
     @Override
     public Principal authenticate(GSSContext gssContext, boolean storeCred) {
         ClassLoader ocl = null;
+        Thread currentThread = null;
         try {
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             return super.authenticate(gssContext, storeCred);
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -1407,15 +1419,17 @@ public class JNDIRealm extends RealmBase {
     @Override
     public Principal authenticate(GSSName gssName, GSSCredential 
gssCredential) {
         ClassLoader ocl = null;
+        Thread currentThread = null;
         try {
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             return super.authenticate(gssName, gssCredential);
         } finally {
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
     }
@@ -2737,6 +2751,7 @@ public class JNDIRealm extends RealmBase {
 
         // Check to see if the connection to the directory can be opened
         ClassLoader ocl = null;
+        Thread currentThread = null;
         JNDIConnection connection = null;
         try {
             // https://bz.apache.org/bugzilla/show_bug.cgi?id=65553
@@ -2744,8 +2759,9 @@ public class JNDIRealm extends RealmBase {
             // running on a JVM that includes a fix for
             // https://bugs.openjdk.java.net/browse/JDK-8273874
             if (!isUseContextClassLoader()) {
-                ocl = Thread.currentThread().getContextClassLoader();
-                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                currentThread = Thread.currentThread();
+                ocl = currentThread.getContextClassLoader();
+                
currentThread.setContextClassLoader(this.getClass().getClassLoader());
             }
             connection = get();
         } catch (NamingException e) {
@@ -2756,8 +2772,8 @@ public class JNDIRealm extends RealmBase {
             containerLog.error(sm.getString("jndiRealm.open"), e);
         } finally {
             release(connection);
-            if (!isUseContextClassLoader()) {
-                Thread.currentThread().setContextClassLoader(ocl);
+            if (currentThread != null) {
+                currentThread.setContextClassLoader(ocl);
             }
         }
 
diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java 
b/java/org/apache/catalina/servlets/DefaultServlet.java
index 4e5290fda7..50c34380ae 100644
--- a/java/org/apache/catalina/servlets/DefaultServlet.java
+++ b/java/org/apache/catalina/servlets/DefaultServlet.java
@@ -1808,19 +1808,19 @@ public class DefaultServlet extends HttpServlet {
         // Prevent possible memory leak. Ensure Transformer and
         // TransformerFactory are not loaded from the web application.
         ClassLoader original;
+        Thread currentThread = Thread.currentThread();
         if (Globals.IS_SECURITY_ENABLED) {
-            PrivilegedGetTccl pa = new PrivilegedGetTccl();
+            PrivilegedGetTccl pa = new PrivilegedGetTccl(currentThread);
             original = AccessController.doPrivileged(pa);
         } else {
-            original = Thread.currentThread().getContextClassLoader();
+            original = currentThread.getContextClassLoader();
         }
         try {
             if (Globals.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa =
-                        new 
PrivilegedSetTccl(DefaultServlet.class.getClassLoader());
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
DefaultServlet.class.getClassLoader());
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(
+                currentThread.setContextClassLoader(
                         DefaultServlet.class.getClassLoader());
             }
 
@@ -1838,10 +1838,10 @@ public class DefaultServlet extends HttpServlet {
             throw new 
ServletException(sm.getString("defaultServlet.xslError"), e);
         } finally {
             if (Globals.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa = new PrivilegedSetTccl(original);
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
original);
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(original);
+                currentThread.setContextClassLoader(original);
             }
         }
     }
diff --git a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java 
b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
index 7b6a8185f3..a610445a3e 100644
--- a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
+++ b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java
@@ -398,6 +398,7 @@ public class McastServiceImpl {
             log.trace("Mcast receive ping from member " + m);
         }
         Runnable t = null;
+        final Thread currentThread = Thread.currentThread();
         if (Arrays.equals(m.getCommand(), Member.SHUTDOWN_PAYLOAD)) {
             if (log.isDebugEnabled()) {
                 log.debug("Member has shutdown:" + m);
@@ -406,12 +407,12 @@ public class McastServiceImpl {
             t = new Runnable() {
                 @Override
                 public void run() {
-                    String name = Thread.currentThread().getName();
+                    String name = currentThread.getName();
                     try {
-                        
Thread.currentThread().setName("Membership-MemberDisappeared.");
+                        currentThread.setName("Membership-MemberDisappeared.");
                         service.memberDisappeared(m);
-                    }finally {
-                        Thread.currentThread().setName(name);
+                    } finally {
+                        currentThread.setName(name);
                     }
                 }
             };
@@ -422,17 +423,17 @@ public class McastServiceImpl {
             t = new Runnable() {
                 @Override
                 public void run() {
-                    String name = Thread.currentThread().getName();
+                    String name = currentThread.getName();
                     try {
-                        
Thread.currentThread().setName("Membership-MemberAdded.");
+                        currentThread.setName("Membership-MemberAdded.");
                         service.memberAdded(m);
-                    }finally {
-                        Thread.currentThread().setName(name);
+                    } finally {
+                        currentThread.setName(name);
                     }
                 }
             };
-        } //end if
-        if ( t != null ) {
+        }
+        if (t != null) {
             executor.execute(t);
         }
     }
@@ -455,9 +456,10 @@ public class McastServiceImpl {
             Runnable t = new Runnable() {
                 @Override
                 public void run() {
-                    String name = Thread.currentThread().getName();
+                    Thread currentThread = Thread.currentThread();
+                    String name = currentThread.getName();
                     try {
-                        
Thread.currentThread().setName("Membership-MemberAdded.");
+                        currentThread.setName("Membership-MemberAdded.");
                         for (ChannelData datum : data) {
                             try {
                                 if (datum != null && 
!member.equals(datum.getAddress())) {
@@ -473,8 +475,8 @@ public class McastServiceImpl {
                                 
log.error(sm.getString("mcastServiceImpl.unableReceive.broadcastMessage"), t);
                             }
                         }
-                    }finally {
-                        Thread.currentThread().setName(name);
+                    } finally {
+                        currentThread.setName(name);
                     }
                 }
             };
@@ -494,14 +496,14 @@ public class McastServiceImpl {
                     Runnable t = new Runnable() {
                         @Override
                         public void run() {
-                            String name = Thread.currentThread().getName();
+                            Thread currentThread = Thread.currentThread();
+                            String name = currentThread.getName();
                             try {
-                                
Thread.currentThread().setName("Membership-MemberExpired.");
+                                
currentThread.setName("Membership-MemberExpired.");
                                 service.memberDisappeared(member);
                             } finally {
-                                Thread.currentThread().setName(name);
+                                currentThread.setName(name);
                             }
-
                         }
                     };
                     executor.execute(t);
diff --git a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java 
b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
index 8286f84908..7fe9982d71 100644
--- a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
+++ b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java
@@ -173,13 +173,14 @@ public class StuckThreadDetectionValve extends ValveBase {
         // Keeping a reference to the thread object here does not prevent
         // GC'ing, as the reference is removed from the Map in the finally 
clause
 
-        Long key = Long.valueOf(Thread.currentThread().getId());
+        Thread currentThread = Thread.currentThread();
+        Long key = Long.valueOf(currentThread.getId());
         StringBuffer requestUrl = request.getRequestURL();
         if (request.getQueryString() != null) {
             requestUrl.append('?');
             requestUrl.append(request.getQueryString());
         }
-        MonitoredThread monitoredThread = new 
MonitoredThread(Thread.currentThread(), requestUrl.toString(),
+        MonitoredThread monitoredThread = new MonitoredThread(currentThread, 
requestUrl.toString(),
                 interruptThreadThreshold > 0);
         activeThreads.put(key, monitoredThread);
 
diff --git a/java/org/apache/coyote/AsyncStateMachine.java 
b/java/org/apache/coyote/AsyncStateMachine.java
index 69925dfc0c..3c08c0f7a9 100644
--- a/java/org/apache/coyote/AsyncStateMachine.java
+++ b/java/org/apache/coyote/AsyncStateMachine.java
@@ -432,27 +432,28 @@ public class AsyncStateMachine {
             // Execute the runnable using a container thread from the
             // Connector's thread pool. Use a wrapper to prevent a memory leak
             ClassLoader oldCL;
+            Thread currentThread = Thread.currentThread();
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedAction<ClassLoader> pa = new PrivilegedGetTccl();
+                PrivilegedAction<ClassLoader> pa = new 
PrivilegedGetTccl(currentThread);
                 oldCL = AccessController.doPrivileged(pa);
             } else {
-                oldCL = Thread.currentThread().getContextClassLoader();
+                oldCL = currentThread.getContextClassLoader();
             }
             try {
                 if (Constants.IS_SECURITY_ENABLED) {
-                    PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(this.getClass().getClassLoader());
+                    PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(currentThread, this.getClass().getClassLoader());
                     AccessController.doPrivileged(pa);
                 } else {
-                    
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                    
currentThread.setContextClassLoader(this.getClass().getClassLoader());
                 }
 
                 processor.getExecutor().execute(runnable);
             } finally {
                 if (Constants.IS_SECURITY_ENABLED) {
-                    PrivilegedAction<Void> pa = new PrivilegedSetTccl(oldCL);
+                    PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(currentThread, oldCL);
                     AccessController.doPrivileged(pa);
                 } else {
-                    Thread.currentThread().setContextClassLoader(oldCL);
+                    currentThread.setContextClassLoader(oldCL);
                 }
             }
         } else {
diff --git a/java/org/apache/jasper/JspC.java b/java/org/apache/jasper/JspC.java
index 6ea5918666..c80d1e6224 100644
--- a/java/org/apache/jasper/JspC.java
+++ b/java/org/apache/jasper/JspC.java
@@ -1294,6 +1294,7 @@ public class JspC extends Task implements Options {
         }
 
         ClassLoader originalClassLoader = null;
+        Thread currentThread = Thread.currentThread();
 
         try {
             // set up a scratch/output dir if none is provided
@@ -1318,8 +1319,8 @@ public class JspC extends Task implements Options {
                 clctxt.setServletPackageName(targetPackage);
             }
 
-            originalClassLoader = 
Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader(loader);
+            originalClassLoader = currentThread.getContextClassLoader();
+            currentThread.setContextClassLoader(loader);
 
             clctxt.setClassLoader(loader);
             clctxt.setClassPath(classPath);
@@ -1363,8 +1364,8 @@ public class JspC extends Task implements Options {
             }
             throw new JasperException(e);
         } finally {
-            if(originalClassLoader != null) {
-                
Thread.currentThread().setContextClassLoader(originalClassLoader);
+            if (originalClassLoader != null) {
+                currentThread.setContextClassLoader(originalClassLoader);
             }
         }
     }
diff --git a/java/org/apache/jasper/compiler/ELFunctionMapper.java 
b/java/org/apache/jasper/compiler/ELFunctionMapper.java
index 5ec20ef0d7..99a79d0b7e 100644
--- a/java/org/apache/jasper/compiler/ELFunctionMapper.java
+++ b/java/org/apache/jasper/compiler/ELFunctionMapper.java
@@ -311,11 +311,12 @@ public class ELFunctionMapper {
             Class<?> clazz;
 
             ClassLoader tccl;
+            Thread currentThread = Thread.currentThread();
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedAction<ClassLoader> pa = new PrivilegedGetTccl();
+                PrivilegedAction<ClassLoader> pa = new 
PrivilegedGetTccl(currentThread);
                 tccl = AccessController.doPrivileged(pa);
             } else {
-                tccl = Thread.currentThread().getContextClassLoader();
+                tccl = currentThread.getContextClassLoader();
             }
 
             try {
diff --git a/java/org/apache/jasper/compiler/JspDocumentParser.java 
b/java/org/apache/jasper/compiler/JspDocumentParser.java
index 0ad4774b14..54160b3187 100644
--- a/java/org/apache/jasper/compiler/JspDocumentParser.java
+++ b/java/org/apache/jasper/compiler/JspDocumentParser.java
@@ -1455,20 +1455,19 @@ class JspDocumentParser
         throws Exception {
 
         ClassLoader original;
+        Thread currentThread = Thread.currentThread();
         if (Constants.IS_SECURITY_ENABLED) {
-            PrivilegedGetTccl pa = new PrivilegedGetTccl();
+            PrivilegedGetTccl pa = new PrivilegedGetTccl(currentThread);
             original = AccessController.doPrivileged(pa);
         } else {
-            original = Thread.currentThread().getContextClassLoader();
+            original = currentThread.getContextClassLoader();
         }
         try {
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa =
-                        new 
PrivilegedSetTccl(JspDocumentParser.class.getClassLoader());
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
JspDocumentParser.class.getClassLoader());
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(
-                        JspDocumentParser.class.getClassLoader());
+                
currentThread.setContextClassLoader(JspDocumentParser.class.getClassLoader());
             }
 
             SAXParserFactory factory = SAXParserFactory.newInstance();
@@ -1500,10 +1499,10 @@ class JspDocumentParser
             return saxParser;
         } finally {
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa = new PrivilegedSetTccl(original);
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
original);
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(original);
+                currentThread.setContextClassLoader(original);
             }
         }
     }
diff --git a/java/org/apache/jasper/compiler/TagPluginManager.java 
b/java/org/apache/jasper/compiler/TagPluginManager.java
index 9b830c8427..3e95ed80f9 100644
--- a/java/org/apache/jasper/compiler/TagPluginManager.java
+++ b/java/org/apache/jasper/compiler/TagPluginManager.java
@@ -77,20 +77,19 @@ public class TagPluginManager {
 
         TagPluginParser parser;
         ClassLoader original;
+        Thread currentThread = Thread.currentThread();
         if (Constants.IS_SECURITY_ENABLED) {
-            PrivilegedGetTccl pa = new PrivilegedGetTccl();
+            PrivilegedGetTccl pa = new PrivilegedGetTccl(currentThread);
             original = AccessController.doPrivileged(pa);
         } else {
-            original = Thread.currentThread().getContextClassLoader();
+            original = currentThread.getContextClassLoader();
         }
         try {
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa =
-                        new 
PrivilegedSetTccl(TagPluginManager.class.getClassLoader());
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
TagPluginManager.class.getClassLoader());
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(
-                        TagPluginManager.class.getClassLoader());
+                
currentThread.setContextClassLoader(TagPluginManager.class.getClassLoader());
             }
 
             parser = new TagPluginParser(ctxt, blockExternal);
@@ -110,10 +109,10 @@ public class TagPluginManager {
             throw new JasperException(e);
         } finally {
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa = new PrivilegedSetTccl(original);
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
original);
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(original);
+                currentThread.setContextClassLoader(original);
             }
         }
 
diff --git a/java/org/apache/naming/ContextBindings.java 
b/java/org/apache/naming/ContextBindings.java
index baf3ce2bdb..9c4895acc2 100644
--- a/java/org/apache/naming/ContextBindings.java
+++ b/java/org/apache/naming/ContextBindings.java
@@ -142,8 +142,9 @@ public class ContextBindings {
                 throw new NamingException(
                         sm.getString("contextBindings.unknownContext", obj));
             }
-            threadBindings.put(Thread.currentThread(), context);
-            threadObjectBindings.put(Thread.currentThread(), obj);
+            Thread currentThread = Thread.currentThread();
+            threadBindings.put(currentThread, context);
+            threadObjectBindings.put(currentThread, obj);
         }
     }
 
@@ -156,8 +157,9 @@ public class ContextBindings {
      */
     public static void unbindThread(Object obj, Object token) {
         if (ContextAccessController.checkSecurityToken(obj, token)) {
-            threadBindings.remove(Thread.currentThread());
-            threadObjectBindings.remove(Thread.currentThread());
+            Thread currentThread = Thread.currentThread();
+            threadBindings.remove(currentThread);
+            threadObjectBindings.remove(currentThread);
         }
     }
 
diff --git a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java 
b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
index e31c2fea58..933a13c1ca 100644
--- a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
+++ b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java
@@ -52,18 +52,19 @@ public class TldParser {
 
     public TaglibXml parse(TldResourcePath path) throws IOException, 
SAXException {
         ClassLoader original;
+        Thread currentThread = Thread.currentThread();
         if (Constants.IS_SECURITY_ENABLED) {
-            PrivilegedGetTccl pa = new PrivilegedGetTccl();
+            PrivilegedGetTccl pa = new PrivilegedGetTccl(currentThread);
             original = AccessController.doPrivileged(pa);
         } else {
-            original = Thread.currentThread().getContextClassLoader();
+            original = currentThread.getContextClassLoader();
         }
         try (InputStream is = path.openStream()) {
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa = new 
PrivilegedSetTccl(TldParser.class.getClassLoader());
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
TldParser.class.getClassLoader());
                 AccessController.doPrivileged(pa);
             } else {
-                
Thread.currentThread().setContextClassLoader(TldParser.class.getClassLoader());
+                
currentThread.setContextClassLoader(TldParser.class.getClassLoader());
             }
             XmlErrorHandler handler = new XmlErrorHandler();
             digester.setErrorHandler(handler);
@@ -85,10 +86,10 @@ public class TldParser {
         } finally {
             digester.reset();
             if (Constants.IS_SECURITY_ENABLED) {
-                PrivilegedSetTccl pa = new PrivilegedSetTccl(original);
+                PrivilegedSetTccl pa = new PrivilegedSetTccl(currentThread, 
original);
                 AccessController.doPrivileged(pa);
             } else {
-                Thread.currentThread().setContextClassLoader(original);
+                currentThread.setContextClassLoader(original);
             }
         }
     }
diff --git a/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java 
b/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java
index 11d11a8602..c580cfab50 100644
--- a/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java
+++ b/java/org/apache/tomcat/util/security/PrivilegedGetTccl.java
@@ -19,10 +19,19 @@ package org.apache.tomcat.util.security;
 import java.security.PrivilegedAction;
 
 public class PrivilegedGetTccl implements PrivilegedAction<ClassLoader> {
+    private final Thread currentThread;
+
+    @Deprecated
+    public PrivilegedGetTccl() {
+        this(Thread.currentThread());
+    }
+
+    public PrivilegedGetTccl(Thread currentThread) {
+        this.currentThread = currentThread;
+    }
+
     @Override
     public ClassLoader run() {
-        return Thread.currentThread().getContextClassLoader();
+        return currentThread.getContextClassLoader();
     }
 }
-
-
diff --git a/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java 
b/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java
index 739d915794..188a8ae08e 100644
--- a/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java
+++ b/java/org/apache/tomcat/util/security/PrivilegedSetTccl.java
@@ -23,6 +23,7 @@ public class PrivilegedSetTccl implements 
PrivilegedAction<Void> {
     private final ClassLoader cl;
     private final Thread t;
 
+    @Deprecated
     public PrivilegedSetTccl(ClassLoader cl) {
         this(Thread.currentThread(), cl);
     }
diff --git a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java 
b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
index 3de34cb387..7ea4c91ad7 100644
--- a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
+++ b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
@@ -2222,9 +2222,9 @@ public class ThreadPoolExecutor extends 
AbstractExecutorService {
 
 
     protected boolean currentThreadShouldBeStopped() {
-        if (threadRenewalDelay >= 0
-            && Thread.currentThread() instanceof TaskThread) {
-            TaskThread currentTaskThread = (TaskThread) Thread.currentThread();
+        Thread currentThread = Thread.currentThread();
+        if (threadRenewalDelay >= 0 && currentThread instanceof TaskThread) {
+            TaskThread currentTaskThread = (TaskThread) currentThread;
             if (currentTaskThread.getCreationTime() <
                     this.lastContextStoppedTime.longValue()) {
                 return true;
diff --git a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java 
b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
index 024d6351e8..dd5c392801 100644
--- a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
+++ b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java
@@ -74,11 +74,11 @@ public class AsyncChannelGroupUtil {
     private static AsynchronousChannelGroup createAsynchronousChannelGroup() {
         // Need to do this with the right thread context class loader else the
         // first web app to call this will trigger a leak
-        ClassLoader original = Thread.currentThread().getContextClassLoader();
+        Thread currentThread = Thread.currentThread();
+        ClassLoader original = currentThread.getContextClassLoader();
 
         try {
-            Thread.currentThread().setContextClassLoader(
-                    AsyncIOThreadFactory.class.getClassLoader());
+            
currentThread.setContextClassLoader(AsyncIOThreadFactory.class.getClassLoader());
 
             // These are the same settings as the default
             // AsynchronousChannelGroup
@@ -98,7 +98,7 @@ public class AsyncChannelGroupUtil {
                 throw new 
IllegalStateException(sm.getString("asyncChannelGroup.createFail"));
             }
         } finally {
-            Thread.currentThread().setContextClassLoader(original);
+            currentThread.setContextClassLoader(original);
         }
     }
 
diff --git a/java/org/apache/tomcat/websocket/server/WsFrameServer.java 
b/java/org/apache/tomcat/websocket/server/WsFrameServer.java
index d29ea047aa..c40ae31095 100644
--- a/java/org/apache/tomcat/websocket/server/WsFrameServer.java
+++ b/java/org/apache/tomcat/websocket/server/WsFrameServer.java
@@ -123,24 +123,26 @@ public class WsFrameServer extends WsFrameBase {
 
     @Override
     protected void sendMessageText(boolean last) throws WsIOException {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        Thread currentThread = Thread.currentThread();
+        ClassLoader cl = currentThread.getContextClassLoader();
         try {
-            
Thread.currentThread().setContextClassLoader(applicationClassLoader);
+            currentThread.setContextClassLoader(applicationClassLoader);
             super.sendMessageText(last);
         } finally {
-            Thread.currentThread().setContextClassLoader(cl);
+            currentThread.setContextClassLoader(cl);
         }
     }
 
 
     @Override
     protected void sendMessageBinary(ByteBuffer msg, boolean last) throws 
WsIOException {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        Thread currentThread = Thread.currentThread();
+        ClassLoader cl = currentThread.getContextClassLoader();
         try {
-            
Thread.currentThread().setContextClassLoader(applicationClassLoader);
+            currentThread.setContextClassLoader(applicationClassLoader);
             super.sendMessageBinary(msg, last);
         } finally {
-            Thread.currentThread().setContextClassLoader(cl);
+            currentThread.setContextClassLoader(cl);
         }
     }
 
diff --git 
a/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java 
b/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java
index 638154cc51..8a34b6f756 100644
--- 
a/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java
+++ 
b/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java
@@ -114,16 +114,15 @@ public class TestWebappClassLoaderExecutorMemoryLeak 
extends TomcatBaseTest {
 
             @Override
             public void run() {
+                Thread currentThread = Thread.currentThread();
                 try {
-                    while (!Thread.currentThread().isInterrupted()) {
+                    while (!currentThread.isInterrupted()) {
                         Thread.sleep(20000);
-                        System.out.println(Thread.currentThread().getClass()
-                                + " [" + Thread.currentThread().getName()
-                                + "] executing " + this._id);
+                        System.out.println(
+                                currentThread.getClass() + " [" + 
currentThread.getName() + "] executing " + this._id);
                     }
                 } catch (InterruptedException e) {
-                    System.out.println(Thread.currentThread().getClass() + " ["
-                            + Thread.currentThread().getName() + "] EXITING");
+                    System.out.println(currentThread.getClass() + " [" + 
currentThread.getName() + "] EXITING");
                 }
             }
         }
diff --git a/test/org/apache/catalina/startup/TestTomcatClassLoader.java 
b/test/org/apache/catalina/startup/TestTomcatClassLoader.java
index e9292173d5..d1df88c356 100644
--- a/test/org/apache/catalina/startup/TestTomcatClassLoader.java
+++ b/test/org/apache/catalina/startup/TestTomcatClassLoader.java
@@ -54,10 +54,9 @@ public class TestTomcatClassLoader extends TomcatBaseTest {
     @Test
     public void testNonDefaultClassLoader() throws Exception {
 
-        ClassLoader cl = new URLClassLoader(new URL[0],
-                Thread.currentThread().getContextClassLoader());
-
-        Thread.currentThread().setContextClassLoader(cl);
+        Thread currentThread = Thread.currentThread();
+        ClassLoader cl = new URLClassLoader(new URL[0], 
currentThread.getContextClassLoader());
+        currentThread.setContextClassLoader(cl);
 
         Tomcat tomcat = getTomcatInstance();
         tomcat.getServer().setParentClassLoader(cl);
diff --git a/test/org/apache/juli/TestClassLoaderLogManager.java 
b/test/org/apache/juli/TestClassLoaderLogManager.java
index 674600edf4..b2482af790 100644
--- a/test/org/apache/juli/TestClassLoaderLogManager.java
+++ b/test/org/apache/juli/TestClassLoaderLogManager.java
@@ -93,9 +93,10 @@ public class TestClassLoaderLogManager {
     @Test
     public void testBug66184() throws IOException {
         final ClassLoader cl = new TestClassLoader();
-        final ClassLoader oldCL = 
Thread.currentThread().getContextClassLoader();
+        final Thread currentThread = Thread.currentThread();
+        final ClassLoader oldCL = currentThread.getContextClassLoader();
         try {
-            Thread.currentThread().setContextClassLoader(cl);
+            currentThread.setContextClassLoader(cl);
             final ClassLoaderLogManager logManager = new 
ClassLoaderLogManager();
             logManager.readConfiguration();
             final Logger rootLogger = logManager.getLogger("");
@@ -103,7 +104,7 @@ public class TestClassLoaderLogManager {
             Assert.assertNull("root logger has a parent", 
rootLogger.getParent());
             Assert.assertEquals(Level.INFO, rootLogger.getLevel());
         } finally {
-            Thread.currentThread().setContextClassLoader(oldCL);
+            currentThread.setContextClassLoader(oldCL);
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to