ThreadLocal in Java - Example Program and Tutorial

ThreadLocal in  Java is another way to achieve  thread-safety apart from writing immutable classes. If you have been writing multi-threaded or concurrent code in Java then you must be familiar with cost of synchronization or locking which can greatly affect Scalability of application, but there is no choice other than synchronize if you are sharing objects between multiple threads. ThreadLocal in Java is a different way to achieve thread-safety, it doesn't address synchronization requirement, instead it eliminates sharing by providing explicitly copy of Object to each thread. Since Object is no more shared there is no requirement of Synchronization which can improve scalability and performance of application. In this Java ThreadLocal tutorial we will see important points about ThreadLocal in Java, when to use ThreadLocal in Java and a simple Example of ThreadLocal in Java program.

When to use ThreadLocal in Java

Many Java Programmer question where to use ThreadLocal in Java and some even argue benefit of ThreadLocal variable, but ThreadLocal has many genuine use cases and that's why its added in to standard Java Platform Library. I agree though until you are not in concurrent programming, you will rarely use ThreadLocal. below are some well know usage of ThreadLocal class in Java:

1) ThreadLocal are fantastic to implement Per Thread Singleton classes or per thread context  information like transaction id.

2) You can wrap any non Thread Safe object in ThreadLocal and suddenly its uses becomes Thread-safe, as its only being used by Thread Safe. One of the classic example of ThreadLocal is sharing SimpleDateForamt. Since  SimpleDateFormat is not thread safe, having a global formatter may not work but having per Thread formatter will certainly work.

3) ThreadLocal provides another way to extend Thread. If you want to preserve or carry information from one method call to another you can carry it by using ThreadLocal. This can provide immense flexibility as you don't need to modify any method.

On basic level ThreadLocal provides Thread Confinement which is extension of  local variable. while local variable only accessible on block they are declared, ThreadLocal are visible only in  Single Thread. No two Thread can see each others ThreadLocal variable. Real Life example of ThreadLocal are in  J2EE application servers which uses java ThreadLocal variable to keep track of transaction and security Context. It makes lot of sense to share heavy object like Database Connection as ThreadLocal in order to avoid excessive creation and cost of locking in case of sharing global instance.

Java ThreadLocal Example – Code


import  java.io.IOException ;
import  java.text.DateFormat ;
import  java.text.SimpleDateFormat ;
import  java.util.Date ;

/**
 *
 * @author
 */

public class
 ThreadLocalTest  {

     public static void main ( String args [])  throws IOException  {
         Thread t1 =  new Thread ( new Task ()) ;   
         Thread t2 =  new Thread (  new Task ()) ;
      
        t1. start () ;
        t2. start () ;       
      
     }
    
     /*
     * Thread safe format method because every thread will use its own DateFormat
     */

     public static String threadSafeFormat ( Date date ){
         DateFormat formatter = PerThreadFormatter. getDateFormatter () ;
         return formatter. format (date ) ;
     }
    
}


/*
 * Thread Safe implementation of SimpleDateFormat
 * Each Thread will get its own instance of SimpleDateFormat which will not be shared between other threads. *
 */

class PerThreadFormatter  {

     private static final ThreadLocal < SimpleDateFormat > dateFormatHolder =  new ThreadLocal < SimpleDateFormat > ()  {

         /*
         * initialValue() is called
         */

        @ Override
        protected SimpleDateFormat
 initialValue ()  {
             System. out. println ( "Creating SimpleDateFormat for Thread : " +  Thread. currentThread (). getName ()) ;
             return new SimpleDateFormat ( "dd/MM/yyyy" ) ;
         }
     } ;

     /*
     * Every time there is a call for DateFormat, ThreadLocal will return calling
     * Thread's copy of SimpleDateFormat
     */

     public static DateFormat getDateFormatter ()  {
         return dateFormatHolder. get () ;
     }
}

class Task  implements Runnable {
    
    @ Override
    public void
 run ()  {
        for ( int i= 0 ; i < 2 ; i++ ){
             System. out. println ( "Thread: " +  Thread. currentThread (). getName () +  " Formatted Date: " + ThreadLocalTest. threadSafeFormat ( new Date ())  ) ;
         }       
     }
}

Output:
Creating  SimpleDateFormat for  Thread : Thread- 0
Creating  SimpleDateFormat for  Thread : Thread- 1
Thread: Thread- 1 Formatted  Date30/05/ 2012
Thread: Thread- 1 Formatted  Date30/05/ 2012
Thread: Thread- 0 Formatted  Date30/05/ 2012
Thread: Thread- 0 Formatted  Date30/05/ 2012

If you look the output of above program than you will find that when different thread calls getFormatter() method of ThreadLocal class than its call its initialValue() method which creates exclusive instance of SimpleDateFormat for that Thread. Since SimpleDateFormat is not shared between thread and essentially local to the thread which creates its our threadSafFormat() method is  completely thread-safe.

Important points on Java ThreadLocal Class

1. ThreadLocal in Java is introduced on JDK 1.2 but it later generified in JDK 1.4 to introduce type safety on ThreadLocal variable.

2. ThreadLocal can be associated with Thread scope, all the code which is executed by Thread has access to ThreadLocal variables but two thread can not see each others ThreadLocal variable.

3. Each  thread holds an exclusive copy of ThreadLocal variable which becomes eligible to Garbage collection after thread finished or died, normally or due to any Exception, Given those ThreadLocal variable doesn't have any other live references.

4. ThreadLocal variables in Java are generally private static fields in Classes and maintain its state inside Thread.

We saw how ThreadLocal in Java opens another avenue for thread-safety. Though concept of thread-safety by confining object to Thread is there from JDK 1. 0 and many programmer has there own custom ThreadLocal classes, having ThreadLocal in Java API makes it a lot more easy and standard. Think about ThreadLocal variable while designing concurrency in your application. Don't misunderstood that ThreadLocal is  alternative of Synchronization, it all depends upon design. If design allows each thread to have there own copy of object than ThreadLocal is there to use.

Reference: http://javarevisited.blogspot.com/2012/05/how-to-use-threadlocal-in-java-benefits.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值