threadlocal为每个线程维护唯一的一个对象。
先来个例子
public class ThreadLocalStudy {
private ThreadLocal<User> th = new ThreadLocal<User>();
public void add(){
User u = new User("张三");
//使用ThreadLocal存放一个User对象
th.set(u);
}
public void get(){
//获取存放在ThreadLocal中的User对象
User u = th.get();
System.out.println(u);
}
class User{
private String name;
public User(String name){
this.name = name;
}
}
}
public class TestThreadLocalStudy {
public static void main(String[] args) {
final ThreadLocalStudy ss = new ThreadLocalStudy();
ss.add();//主线程
ss.get();
new Thread(){//新建一个线程
public void run() {
ss.get();
};
}.start();
new Thread(){//新建一个线程
public void run() {
ss.add();
ss.get();
};
}.start(); }}
输出结果为3个不同的值。
ThreadLocal在实际中的应用
如herbinate的数据库session,由于多线程共享一个数据库连接是不安全的,因此需要每个线程返回同一个session。
hibernate实现session的源码如下:
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() {
Session s = (Session)session.get();
//open a new session,if this session has none
if(s == null){
s = sessionFactory.openSession();
session.set(s);
}
return s;
}