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

运行结果

 

可以看出,同一个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默认的值,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值