理解Threadlocal

ThreadLocal 简介

简单说,threadlocal的作用就是保证你在调用get的时候获取的值,是在同一个线程中,你之前set过的值。

private static final ThreadLocal<String> tlocal=new ThreadLocal();
/*假设有两个线程都执行完1,并且没有执行2.后面不管哪个线程先执行2,取出来的值都是自己之前set的值*/
void foo(){
    tlocal.set(UUID.toString());//1
    tlocal.get();//2
}

或者说,threadlocal就是往线程中set一个值,在这个线程的生命周期中,不需要显示传递,都可以获取到这个值

ThreadLocal 原理

下面看下Threadlocal部分源码

java.lang.ThreadLocal
public class ThreadLocal<T> {
    ....
    public void set(T value) {
        Thread t = Thread.currentThread();//获取当前线程
        ThreadLocalMap map = getMap(t);//通过当前线程获取了一个ThreadLocalMap
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;//java.lang.Thread 有个ThreadLocalMap 的成员变量

    /*ThreadLocalMap是一个通过开放寻址实现的,key类型为ThreadLocal的Map,其中Entry为弱引用*/
    static class ThreadLocalMap {
        static class Entry extends WeakReference<ThreadLocal> {
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }
        private static final int INITIAL_CAPACITY = 16;

        private Entry[] table;
        ...
    }
}

说白了就是这样

  1. 通过Thread.currentThread()可以获取代表当前线程的线程实例
  2. 每个thread对象(或者说每个线程)都有个key类型为Threadlocal的 Map,Map的value就是我们存的值
  3. 如果我们要往thread(线程)的map put值或get值,必须通过ThreadLocal 来访问这个对象

1和2 ,感觉就像这样

private static final ThreadLocal<String> tlocal=new ThreadLocal();
void foo(){
    Thread.currentThread().put(tlocal,UUID.toString());
    Thread.currentThread().get(tlocal);
}

感觉说的不是很清楚。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值