ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。
简单的使用()
public class ThreadLocalTest{
//如果是普通的变量
public Integer num=0;
}
public class MyTest extends Thread{
ThreadLocalTest myTarget;
public MyTest(String name,ThreadLocalTest t){
this.setName(name);
myTarget=t;
}
@Override
public void run() {
for (int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"的num值:"+myTarget.num++);
}
}
}
public class testMain {
public static void main(String[] args) {
ThreadLocalTest t=new ThreadLocalTest();
//两个线程都是用同一个ThreadLocalTest
MyTest t1=new MyTest("一号机",t);
MyTest t2=new MyTest("二号机",t);
t1.start();
t2.start();
}
}
运行结果
可以看出,同一个Object的某一个变量在不同线程中仍然是共享的,如果我们想要同一个Object的某些变量在不同的线程中分别有不同的值,那么就需要用到ThreadLocal了
public class ThreadLocalTest{
//如果是普通的变量
//public Integer num=0;
//每个ThreadLocalTest都有一个num:
public static final ThreadLocal<Integer> num=new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
//如果初始值没设置 就返回0
return 0;
}
};
}
Thread类中
public class MyTest extends Thread{
ThreadLocalTest myTarget;
public MyTest(String name,ThreadLocalTest t){
this.setName(name);
myTarget=t;
}
@Override
public void run() {
myTarget.num.set(0);//初始化为0,其实也可以不用写,因为写了默认值方法了
for (int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"的num值:"+myTarget.num.get());
myTarget.num.set(myTarget.num.get()+1);//每次加1
}
}
}
Main函数不变:运行
可以看出每个线程中的num都是自己去维护值的
所以这样就更好理解ThreadLocal的作用了吧
常用方法
get() 返回当前线程的此线程局部变量的副本中的值。
set(T value) 将当前线程的此线程局部变量的副本设置为指定的值
remove() 删除此线程局部变量的当前线程的值。
initialValue() 里面return默认的值,