1.ThreadLocal是什么

  ThreadLocal翻译过来本地线程?实则不然,ThreadLocal类实际上是给多线程中的每个线程存放本地变量(针对于每一个线程)的类,就比如,水表,ThreadLocal类给每一个用户单独的水表。

  每个线程可以通过set()/get()方法来获取属于自己的值

  set方法:

  

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);
        }
    }

  可以发现,set方法是把当前线程作为key,存储的值作为value,用ThreadLocalmap来储存的。

  get()方法:

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

  与set对应,从map中通过key(当前线程)取出value。

  通过上面可以发现,所谓的线程本地变量,是放在每个线程的ThreadLoaclMap里面的。

2.一个小例子

  

public class ThreadLocalTest {
    public  static ThreadLocal<Integer> aInt = new ThreadLocal<>();

    public  Integer getInt(){
        return aInt.get();
    }

    public static class aThread implements Runnable{
        @Override
        public void run(){
            ThreadLocalTest a = new ThreadLocalTest();
            a.aInt.set(1);
            while(a.getInt()!=5){
                System.out.print(Thread.currentThread()+":");
                System.out.println(a.getInt());
                a.aInt.set(a.aInt.get()+1);
            }
        }

    }

    public static void main(String[] args) {

        aThread at = new aThread();
        Thread a= new Thread(at);
        Thread b= new Thread(at);
        a.start();
        b.start();
    }
}

  结果:

  

Thread[Thread-0,5,main]:1
Thread[Thread-0,5,main]:2
Thread[Thread-0,5,main]:3
Thread[Thread-0,5,main]:4
Thread[Thread-1,5,main]:1
Thread[Thread-1,5,main]:2
Thread[Thread-1,5,main]:3
Thread[Thread-1,5,main]:4

3.需要注意的是,用完之后,最后在线程中调用remove()方法,因为ThreadLocalMap的key是弱引用,key是强引用,垃圾回收时,会把key去掉,结果就是一直存在一个key==null,value!=null的键值对。

posted on 2021-04-18 14:19  Refuse_to_be_simple  阅读(47)  评论(0编辑  收藏  举报