ThreadLocal是什么?怎么用?

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();
    }
}

运行结果

ThreadLocal是什么?怎么用?_第1张图片

 

可以看出,同一个Object的某一个变量在不同线程中仍然是共享的,如果我们想要同一个Object的某些变量在不同的线程中分别有不同的值,那么就需要用到ThreadLocal了

public class ThreadLocalTest{
    //如果是普通的变量
    //public Integer num=0;
    //每个ThreadLocalTest都有一个num:
    public static final ThreadLocal num=new ThreadLocal(){
        @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函数不变:运行

ThreadLocal是什么?怎么用?_第2张图片

可以看出每个线程中的num都是自己去维护值的

所以这样就更好理解ThreadLocal的作用了吧

常用方法

get()    返回当前线程的此线程局部变量的副本中的值。
set(T value)    将当前线程的此线程局部变量的副本设置为指定的值
remove()    删除此线程局部变量的当前线程的值。
initialValue()    里面return默认的值,

你可能感兴趣的:(多线程学,多线程,ThreadLocal)