ThreadLocal类为每个线程都创建了一个副本,即当用来保存Connection时,每个线程中的Connection都不是同一个对象。
使用时在一个类中定义一个静态ThreadLocal。
定义如下:
public class Test{
private static ThreadLocal<Person> connectionHolder = new ThreadLocal<Person>() {
public Person initialValue() {
return new Person();
}
};
public static Person getConnection() {
return connectionHolder.get();
}
}
在线程中使用
Person connection = Test.getConnection();
ThreadLocal为每个线程中threadLocals变量(类型为ThreadLocal.ThreadLocalMap)的key值,通过get来获取副本时,以其为key。
通过ThreadLocal的get()源码可以看出当第一次执行get来获取此ThreadLocal的保存值时,会调用setInitialValue()方法,在这个方法中会调用initialValue(),即调用重写initialValue()返回一个新的Person对象。
注:若initialValue()重写时返回的不是new Person(),而是一个成员变量值,则每个线程中就是同一个对象。
参考
http://www.cnblogs.com/dolphin0520/p/3920407.html