1、首先在每个线程内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个
threadLocals就是用来存储实际变量副本的,键值为当前ThreadLocal变量,value为变量副本。
2、初始时,在Thread里面,threadLocals为空,当通过threadLocals变量调用get()方法或者set()方法,
就会对Thread类中的threadLocals进行初始化,并且一当前ThreadLocal变量为键值,以ThreadLocal
要保存的副本变量为value,存到threadLocals。
3、然后在当前线程中,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。
4、为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可以有
多个threadLocal变量。
5、在进行get之前,必须先进行set,否则会报空指针异常。但是如果想要在get之前不需要调用
threadLocals就是用来存储实际变量副本的,键值为当前ThreadLocal变量,value为变量副本。
2、初始时,在Thread里面,threadLocals为空,当通过threadLocals变量调用get()方法或者set()方法,
就会对Thread类中的threadLocals进行初始化,并且一当前ThreadLocal变量为键值,以ThreadLocal
要保存的副本变量为value,存到threadLocals。
3、然后在当前线程中,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。
4、为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可以有
多个threadLocal变量。
5、在进行get之前,必须先进行set,否则会报空指针异常。但是如果想要在get之前不需要调用
set就能正常运行的话,那就需要重写intialValue()。
6、最常见的ThreadLocal使用场景为:用来解决数据连接、Session管理等。
例如数据库连接管理:
private static ThreadLocal<Connection> connHolder = new ThreadLocal<Connection>() {
public Connnection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
private static Connection getConnection() {
return connHolder.get();
}
原文地址:http://www.cnblogs.com/dolphin0520/p/3920407.html