ThreadLocal的原理

在多线程环境下,会使用ThreadLocal来保存变量,这样即使在多线程的环境下,也能够以线程安全的方式来使用变量。


1、在多线程环境中,使用ThreadLocal来保存变量时,变量是存在什么地方?

     简要来说,使用ThreadLocal来保存相关变量时,这个变量是存在当前使用ThreadLocal对象的这个线程中的,也就是当前线程,即Thread.currentThread()返回的线程中


2、ThreadLocal的实现原理

     要说明ThreadLocal的实现原理,先需要说明几个相关的类ThreadLocal.ThreadLocalMap(ThreadLocal的静态内部类),以及ThreadLocal.ThreadLocalMap.Entry(ThreadLocalMap的静态内部类)。

     每个Entry就是一个存储的变量信息,类定义如下
     static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super (k);
                value = v;
            }
        }
   在Entry中进行存储时,以保存这个变量的ThreadLocal为key,以要保存的变量为value。

   而ThreadLocalMap则是使用一个Entry数组,来进行信息的存储。所以,简单说来,我们存储的变量,最后是转成了一个个的Entry对象,由一个ThreadLocalMap对象来进行管理。下面是ThreadLocalMap的属性定义。
   static class ThreadLocalMap {
        /**
         * The initial capacity -- MUST be a power of two.
         */
        private static final int INITIAL_CAPACITY = 16;

        /**
         * The table, resized as necessary.
         * table.length MUST always be a power of two.
         */
        private Entry[] table;

        /**
         * The number of entries in the table.
         */
        private int size = 0;

        /**
         * The next size value at which to resize.
         */
        private int threshold; // Default to 0
          /**
           xxxxxxx
           */
    }

还有一个和ThreadLocal使用相关的是Thread类的一个属性threadLocals,这个属性的定义如下 ThreadLocal.ThreadLocalMap threadLocals = null ;
到此,相关的基础类型就都已经定义出来了。
下面来看下ThreadLocal的设置属性的方法,在ThreadLocal中,通过将以上这些基础类进行组装,来完成了相应的功能
   public void set(T value) {
        Thread t = Thread. currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null )
            map.set( this , value);
        else
            createMap(t, value);
    }
获取了当前的线程,然后获取这个类的ThreadLocalMap对象
ThreadLocalMap getMap (Thread t) {
        return t. threadLocals ;
    }
将数据保存到这个ThreadLocalMap对象中,也就是保存到了当前线程中。所以,简单来说,数据是保存在了当前线程中。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值