threadLocal给每个线程提供局部变量,解决线程安全问题。
ThreadLocal的接口 4个方法
1 void set(Object value)设置当前线程的线程局部变量的值。
2 public Object get()该方法返回当前线程所对应的线程局部变量。
3 public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
4 protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。
public class Thread2 {
public static ThreadLocal<Integer> seq = new ThreadLocal<Integer>(){
public Integer initialValue(){
return 0;
}
};
public Integer getSql(){
seq.set(seq.get()+1);
return seq.get();
}
public static void main(String[] args) {
Thread2 sn = new Thread2();
Te t1 = new Te(sn);
Te t2 = new Te(sn);
Te t3 = new Te(sn);
t1.start();
t2.start();
t3.start();
}
}
class Te extends Thread{
Thread2 sn = new Thread2();
public Te(Thread2 sn){
this.sn = sn;
}
@Override
public void run() {
for (int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName() + "-----" + sn.getSql());
}
}
}
ThreadLocal底层是通过map集合实现的。