满足使用场景ThreadLocal内部是如何设计的?ThreadLoacl内部持有ThreadLocalMap/**的静态内部类**ThreadLocalMap是一个自定义的哈希映射,仅适用于*维护线程局部值。*ThreadLocal类之外没有任何操作导出。该类是私有包*允许在类Thread中声明字段。为了帮助处理*非常大且长期存在的用法,哈希表条目使用*WeakReferences作为键。但是,由于不使用引用队列,只有当表开始空间不足时,才能保证删除陈旧的条目。*/staticclassThreadLocalMap{注释写的很清楚,它是一个hashmap数据结构,用来保存维护线程局部值的局部线程变量。也就是说,一个线程有一个本地的hashMap对象,这个hashMap对象持有多个本地线程对象的线程本地值。一般来说,一个线程对应多个线程局部对象。例如,当获取一个对象时,内部源代码会这样做/***返回当前线程的这个*线程局部变量的副本中的值。如果变量对于当前线程没有值,它首先被初始化为返回的值*通过调用{@link#initialValue}方法。**@return这个线程局部的当前线程的值*/publicTget(){Threadt=Thread.currentThread();ThreadLocalMapmap=getMap(t);if(map!=null){ThreadLocalMap.Entrye=map.getEntry(this);if(e!=null){@SuppressWarnings("unchecked")T结果=(T)e.value;返回结果;}}返回setInitialValue();}/***set()的变体,用于建立初始值。使用*代替set()以防用户覆??盖了theset()方法。**@return初始值*/privateTsetInitialValue(){Tvalue=initialValue();线程t=Thread.currentThread();ThreadLocalMapmap=getMap(t);if(map!=null)map.set(this,value);否则createMap(t,value);返回值;}返回初始化对象
