On Mon, May 4, 2020 at 4:43 PM <ma...@apache.org> wrote: > This is an automated email from the ASF dual-hosted git repository. > > markt pushed a commit to branch master > in repository https://gitbox.apache.org/repos/asf/tomcat.git > > commit 1719b71374d57d59bdcd99537bf13348cdaf87c7 > Author: KangZhiDong <world...@gmail.com> > AuthorDate: Sat Apr 25 01:30:47 2020 +0800 > > Avoid waste of resources due to reconstruction of objects > --- > .../apache/catalina/core/ApplicationContext.java | 2 +- > .../apache/catalina/ha/tcp/ReplicationValve.java | 2 +- > .../catalina/session/PersistentManagerBase.java | 2 +- > .../catalina/valves/rewrite/RewriteCond.java | 2 +- > .../catalina/valves/rewrite/RewriteRule.java | 4 ++-- > .../catalina/valves/rewrite/RewriteValve.java | 2 +- > java/org/apache/juli/ClassLoaderLogManager.java | 2 +- > test/org/apache/catalina/valves/Benchmarks.java | 26 > +++++++++++----------- > 8 files changed, 21 insertions(+), 21 deletions(-) >
https://bz.apache.org/bugzilla/show_bug.cgi?id=64432 Ok, so this looked like very fishy savings. It turns out each object instance may want to have its own thread local. IMO that's the case for nearly all the classes above, and either way it's probably not a good idea to take any chances. I think this should be reverted. Rémy > > diff --git a/java/org/apache/catalina/core/ApplicationContext.java > b/java/org/apache/catalina/core/ApplicationContext.java > index 61981e5..004055a 100644 > --- a/java/org/apache/catalina/core/ApplicationContext.java > +++ b/java/org/apache/catalina/core/ApplicationContext.java > @@ -171,7 +171,7 @@ public class ApplicationContext implements > ServletContext { > /** > * Thread local data used during request dispatch. > */ > - private final ThreadLocal<DispatchData> dispatchData = new > ThreadLocal<>(); > + private static final ThreadLocal<DispatchData> dispatchData = new > ThreadLocal<>(); > > > /** > diff --git a/java/org/apache/catalina/ha/tcp/ReplicationValve.java > b/java/org/apache/catalina/ha/tcp/ReplicationValve.java > index 144dbbb..8cd73b9 100644 > --- a/java/org/apache/catalina/ha/tcp/ReplicationValve.java > +++ b/java/org/apache/catalina/ha/tcp/ReplicationValve.java > @@ -85,7 +85,7 @@ public class ReplicationValve > /** > * crossContext session container > */ > - protected final ThreadLocal<ArrayList<DeltaSession>> > crossContextSessions = > + protected static final ThreadLocal<ArrayList<DeltaSession>> > crossContextSessions = > new ThreadLocal<>() ; > > /** > diff --git a/java/org/apache/catalina/session/PersistentManagerBase.java > b/java/org/apache/catalina/session/PersistentManagerBase.java > index 9f52c44..1fd08be 100644 > --- a/java/org/apache/catalina/session/PersistentManagerBase.java > +++ b/java/org/apache/catalina/session/PersistentManagerBase.java > @@ -188,7 +188,7 @@ public abstract class PersistentManagerBase extends > ManagerBase > * Session that is currently getting swapped in to prevent loading it > more > * than once concurrently > */ > - private final ThreadLocal<Session> sessionToSwapIn = new > ThreadLocal<>(); > + private static final ThreadLocal<Session> sessionToSwapIn = new > ThreadLocal<>(); > > > // ------------------------------------------------------------- > Properties > diff --git a/java/org/apache/catalina/valves/rewrite/RewriteCond.java > b/java/org/apache/catalina/valves/rewrite/RewriteCond.java > index 47a904c..a980d81 100644 > --- a/java/org/apache/catalina/valves/rewrite/RewriteCond.java > +++ b/java/org/apache/catalina/valves/rewrite/RewriteCond.java > @@ -28,7 +28,7 @@ public class RewriteCond { > > public static class PatternCondition extends Condition { > public Pattern pattern; > - private ThreadLocal<Matcher> matcher = new ThreadLocal<>(); > + private static ThreadLocal<Matcher> matcher = new ThreadLocal<>(); > > @Override > public boolean evaluate(String value, Resolver resolver) { > diff --git a/java/org/apache/catalina/valves/rewrite/RewriteRule.java > b/java/org/apache/catalina/valves/rewrite/RewriteRule.java > index 833a12c..0aa96de 100644 > --- a/java/org/apache/catalina/valves/rewrite/RewriteRule.java > +++ b/java/org/apache/catalina/valves/rewrite/RewriteRule.java > @@ -26,7 +26,7 @@ public class RewriteRule { > > protected RewriteCond[] conditions = new RewriteCond[0]; > > - protected ThreadLocal<Pattern> pattern = new ThreadLocal<>(); > + protected static ThreadLocal<Pattern> pattern = new ThreadLocal<>(); > protected Substitution substitution = null; > > protected String patternString = null; > @@ -186,7 +186,7 @@ public class RewriteRule { > protected boolean cookieSecure = false; > protected boolean cookieHttpOnly = false; > protected Substitution cookieSubstitution = null; > - protected ThreadLocal<String> cookieResult = new ThreadLocal<>(); > + protected static ThreadLocal<String> cookieResult = new > ThreadLocal<>(); > > /** > * This forces a request attribute named VAR to be set to the value > VAL, > diff --git a/java/org/apache/catalina/valves/rewrite/RewriteValve.java > b/java/org/apache/catalina/valves/rewrite/RewriteValve.java > index 20d8ba0..9025293 100644 > --- a/java/org/apache/catalina/valves/rewrite/RewriteValve.java > +++ b/java/org/apache/catalina/valves/rewrite/RewriteValve.java > @@ -77,7 +77,7 @@ public class RewriteValve extends ValveBase { > /** > * If rewriting occurs, the whole request will be processed again. > */ > - protected ThreadLocal<Boolean> invoked = new ThreadLocal<>(); > + protected static ThreadLocal<Boolean> invoked = new ThreadLocal<>(); > > > /** > diff --git a/java/org/apache/juli/ClassLoaderLogManager.java > b/java/org/apache/juli/ClassLoaderLogManager.java > index a04285c..cf3ad4c 100644 > --- a/java/org/apache/juli/ClassLoaderLogManager.java > +++ b/java/org/apache/juli/ClassLoaderLogManager.java > @@ -112,7 +112,7 @@ public class ClassLoaderLogManager extends LogManager { > * This prefix is used to allow using prefixes for the properties > names > * of handlers and their subcomponents. > */ > - protected final ThreadLocal<String> prefix = new ThreadLocal<>(); > + protected static final ThreadLocal<String> prefix = new > ThreadLocal<>(); > > > /** > diff --git a/test/org/apache/catalina/valves/Benchmarks.java > b/test/org/apache/catalina/valves/Benchmarks.java > index 752ebad..5c67d9b 100644 > --- a/test/org/apache/catalina/valves/Benchmarks.java > +++ b/test/org/apache/catalina/valves/Benchmarks.java > @@ -76,14 +76,14 @@ public class Benchmarks { > return "ThreadLocals"; > } > > - private ThreadLocal<Long> currentMillisLocal = new > ThreadLocal<Long>() { > + private static ThreadLocal<Long> currentMillisLocal = new > ThreadLocal<Long>() { > @Override > protected Long initialValue() { > return Long.valueOf(0); > } > }; > > - private ThreadLocal<Date> currentDateLocal = new ThreadLocal<>(); > + private static ThreadLocal<Date> currentDateLocal = new > ThreadLocal<>(); > > @Override > public void run() { > @@ -112,14 +112,14 @@ public class Benchmarks { > long value = 0; > } > > - private ThreadLocal<MutableLong> currentMillisLocal = new > ThreadLocal<MutableLong>() { > + private static ThreadLocal<MutableLong> currentMillisLocal = new > ThreadLocal<MutableLong>() { > @Override > protected MutableLong initialValue() { > return new MutableLong(); > } > }; > > - private ThreadLocal<Date> currentDateLocal = new ThreadLocal<>(); > + private static ThreadLocal<Date> currentDateLocal = new > ThreadLocal<>(); > > @Override > public void run() { > @@ -149,7 +149,7 @@ public class Benchmarks { > public Date currentDate; > } > > - private ThreadLocal<Struct> currentStruct = new > ThreadLocal<Struct>() { > + private static ThreadLocal<Struct> currentStruct = new > ThreadLocal<Struct>() { > @Override > protected Struct initialValue() { > return new Struct(); > @@ -266,33 +266,33 @@ public class Benchmarks { > return "ThreadLocals"; > } > > - private ThreadLocal<String> currentDateStringLocal = new > ThreadLocal<>(); > + private static ThreadLocal<String> currentDateStringLocal = new > ThreadLocal<>(); > > - private ThreadLocal<Date> currentDateLocal = new > ThreadLocal<Date>() { > + private static ThreadLocal<Date> currentDateLocal = new > ThreadLocal<Date>() { > @Override > protected Date initialValue() { > return new Date(); > } > }; > - private ThreadLocal<SimpleDateFormat> dayFormatterLocal = new > ThreadLocal<SimpleDateFormat>() { > + private static ThreadLocal<SimpleDateFormat> dayFormatterLocal = > new ThreadLocal<SimpleDateFormat>() { > @Override > protected SimpleDateFormat initialValue() { > return new SimpleDateFormat("dd"); > } > }; > - private ThreadLocal<SimpleDateFormat> monthFormatterLocal = new > ThreadLocal<SimpleDateFormat>() { > + private static ThreadLocal<SimpleDateFormat> monthFormatterLocal > = new ThreadLocal<SimpleDateFormat>() { > @Override > protected SimpleDateFormat initialValue() { > return new SimpleDateFormat("MM"); > } > }; > - private ThreadLocal<SimpleDateFormat> yearFormatterLocal = new > ThreadLocal<SimpleDateFormat>() { > + private static ThreadLocal<SimpleDateFormat> yearFormatterLocal = > new ThreadLocal<SimpleDateFormat>() { > @Override > protected SimpleDateFormat initialValue() { > return new SimpleDateFormat("yyyy"); > } > }; > - private ThreadLocal<SimpleDateFormat> timeFormatterLocal = new > ThreadLocal<SimpleDateFormat>() { > + private static ThreadLocal<SimpleDateFormat> timeFormatterLocal = > new ThreadLocal<SimpleDateFormat>() { > @Override > protected SimpleDateFormat initialValue() { > return new SimpleDateFormat("hh:mm:ss"); > @@ -354,7 +354,7 @@ public class Benchmarks { > "hh:mm:ss"); > } > > - private ThreadLocal<Struct> structLocal = new > ThreadLocal<Struct>() { > + private static ThreadLocal<Struct> structLocal = new > ThreadLocal<Struct>() { > @Override > protected Struct initialValue() { > return new Struct(); > @@ -415,7 +415,7 @@ public class Benchmarks { > "hh:mm:ss"); > } > > - private ThreadLocal<Struct> structLocal = new > ThreadLocal<Struct>() { > + private static ThreadLocal<Struct> structLocal = new > ThreadLocal<Struct>() { > @Override > protected Struct initialValue() { > return new Struct(); > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > >