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();
}