ThreadLocal<T>学习总结

public class ThreadLocalTest {

    /**
     * @param
     * @Author: xdj
     * @Date: 2019/4/12 10:16
     * @Description:
     * @return: void
     * ThreadLocal是一种变量类型,我们称之为“线程局部变量”
     * 每个线程访问这种变量的时候都会创建该变量的副本,这个变量副本为线程私有
     * ThreadLocal类型的变量一般用private static加以修饰
     */
    @Test
    public void test() {

         ThreadLocal threadLocal = new ThreadLocal(){
             @Override
             protected Object initialValue() {
                 return Thread.currentThread().getId();
             }
         };


//        threadLocal.set("测试threadLocal");

        System.out.println(threadLocal.get());

    }
}

学习ThreadLocal<T>,首先先从它的数据结构开始,ThreadLocal的内部类ThreadLocalMap

  
// 只是截取部分
static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }

而ThreadLocalMap又存储在Thread中。

  /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal中的几个重要方法,提供了重要的操作

                                                                               

get方法

                                                                            

这里通过getMap方法获取当前线程中的所有ThreadLocal<T>记录threadLocals,先判断是否已有值,如果没有则调用setInitialvalue()赋值

                                                                       

set()方法

扫描二维码关注公众号,回复: 5862275 查看本文章

                  

先判断是否有值了,如果有则覆盖,没有则创建新的Map对象。

remove方法

                  

总结:Thread通过ThreadLocalMap来存储线程中的变量,第一次获取时需要先通过set()将值保存进map中。通过泛型来区分给个变量的key。

参考:

  https://www.cnblogs.com/dolphin0520/p/3920407.html

猜你喜欢

转载自www.cnblogs.com/angleshoot/p/10696686.html