WHEN AND HOW SHOULD I USE A THREADLOCAL VARIABLE?

Felix Pickles

Total Post:24

Points:168
Posted by  Felix Pickles
Java  Thread 
 725  View(s)
Ratings:
Rate this:
When should I use a ThreadLocal variable? How is it used?
  1. Mayank Tripathi

    Post:397

    Points:3117
    Re: When and how should I use a ThreadLocal variable?

    One possible (and common) use is when you have some object that is not thread-safe, but you want to avoid synchronizing access to that object (I'm looking at you, SimpleDateFormat). Instead, give each thread its own instance of the object.

    For example:
    public class Foo
    {
        // SimpleDateFormat is not thread-safe, so give one to each thread
        private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
            @Override
            protected SimpleDateFormat initialValue()
            {
                return new SimpleDateFormat("yyyyMMdd HHmm");
            }
        };
        public String formatIt(Date date)
        {
            return formatter.get().format(date);
        }
    }

    Since a ThreadLocal is a reference to data within a given Thread, you can end up with classloading leaks when using ThreadLocals in application servers which use thread pools. You need to be very careful about cleaning up any ThreadLocals you get() or set() by using the ThreadLocal's remove() method.

    If you do not clean up when you're done, any references it holds to classes loaded as part of a deployed webapp will remain in the permanent heap and will never get garbage collected. Redeploying/undeploying the webapp will not clean up each Thread's reference to your webapp's class(es) since the Thread is not something owned by your webapp. Each successive deployment will create a new instance of the class which will never be garbage collected.

    You will end up with out of memory exceptions due to java.lang.OutOfMemoryError: PermGen space and after some googling will probably just increase -XX:MaxPermSize instead of fixing the bug.

Answer

NEWSLETTER

Enter your email address here always to be updated. We promise not to spam!