GeorgeYang'Blog

my technology blog

java并发编程ThreadLocal的使用

阅读:270 创建时间:16-06-27 02:54:49 tags:java

ThreadLocal与synchronized 有着相反的概念,前者在多线程使用时会创建新的对象,后者保证对象在多线程是唯一的。

看代码好理解:

 public class Test {
     ThreadLocal<Long> longLocal = new ThreadLocal<Long>();
     ThreadLocal<String> stringLocal = new ThreadLocal<String>();


     public void set() {
         longLocal.set(Thread.currentThread().getId());
         stringLocal.set(Thread.currentThread().getName());
     }

     public long getLong() {
         return longLocal.get();
     }

     public String getString() {
         return stringLocal.get();
     }

     public static void main(String[] args) throws InterruptedException {
         final Test test = new Test();


         test.set();
         System.out.println(test.getLong());
         System.out.println(test.getString());


         Thread thread1 = new Thread(){
             public void run() {
                 test.set();
                 System.out.println(test.getLong());
                 System.out.println(test.getString());
             };
         };
         thread1.start();
         thread1.join();

         System.out.println(test.getLong());
         System.out.println(test.getString());
     }
 }

运行结果:

 1
 main
 8
 Thread-0
 1
 main

final的test对象,在新线程中,set之后,根据线程重新对变量进行了赋值。

推荐用法:

 private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
    public Connection initialValue() {
        return DriverManager.getConnection(DB_URL);
    }
 };


 //不同线程,拿到的connection是不一样的
 public static Connection getConnection() {
    return connectionHolder.get();
 }