ThreadLocal

如果线程都调用同一个类的数据,会导致数据错误,ThreadLocal用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。

如果有一个类的某个变量会被不同的进程调用,就必须将这个变量设置成ThreadLocal类型 

ThreadLocal一般会加泛型,实例化对象一般有两种方:

第一种方式变量的初始值为null,第二种方式可以给设置的变量赋初始值

 static ThreadLocal<Integer> variable = new ThreadLocal<Integer>();
        static ThreadLocal<Integer> variable = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 1;
        }
    };

常用的方法有四个:

  T=initialValue()  返回此线程局部变量的当前线程的“初始值”。一般不调用set方法第一次调用get的方法的时候回自动调用活得初始值,二般是调用remove以后第一次调用get的时候。

  T=get()    返回当前线程的此线程局部变量副本中的值  

  void=set() 将此线程局部变量设置为指定值

  void=remove()  删除此线程局部变量的当前线程值。

public class TortoiseRun extends Thread {
//    static ThreadLocal<Integer> step = new ThreadLocal<Integer>();
    static ThreadLocal<Integer> step = new ThreadLocal<Integer>(){
    @Override
        protected Integer initialValue() {
        return 1;
        }
    };
    public TortoiseRun(){};
    public TortoiseRun(String name){
        super(name);
    };
    @Override
    public void run(){
        for (int i = 1; i <10; i++) {
            try {
                Thread.currentThread().sleep(1000);
                step.set(i);
                System.out.println(Thread.currentThread().getName()+"走了"+step.get());

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}
public class TestMain {
    public static void main(String[] args) {
        TortoiseRun tortoiserun1=new TortoiseRun("乌龟1");
        TortoiseRun tortoiserun2=new TortoiseRun("乌龟2");
        tortoiserun1.start();
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        tortoiserun2.start();

    }
}

 

posted @ 2019-07-24 13:37  国际惯例  阅读(325)  评论(0编辑  收藏  举报