zoukankan      html  css  js  c++  java
  • ThreadLocal原理

    ThreadLocal类可以看作是当前线程的一个局部变量,只有当前线程可以访问,因此是线程安全的。
    ThreadLocal内部维护了一个ThreadLocalMap类,ThreadLocalMap是一个定制的hash map,用于维护ThreadLocal类的value。
    首先来看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方法时将当前线程对象Thread作为key设置到ThreadLocalMap中去。
    首先通过当前线程对象获取到threadLocalMap对象,如果获取到,则更新值,获取失败,则创建并更新值。

    我们看看createMap的实现:

    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
    
    ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }
    

    ThreadLocalMap对象内部维护了一个弱引用的Entry对象,Entry对象使用当前的ThreadLocal对象作为key。

    再来看看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();
    }
    

    还是通过当前线程对象获取到map,然后取出存放在map中的值。

    最后,ThreadLocal对象的生命周期是线程的生命周期,它会先线程退出的时候 被销毁,如果希望及时回收设置进ThreadLocal中的对象,可以手动调用ThreadLocal.remove()方法。防止内存泄漏。

  • 相关阅读:
    VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
    它处资料:二分图最大匹配的匈牙利算法
    DataGuard备库ORA-01196故障恢复一则
    Leetcode41: Remove Duplicates from Sorted List
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 使用Napa开发SharePoint应用程序
    关于OC的内存管理-01
    P2002 消息扩散
    P1726 上白泽慧音
    2594 解药还是毒药
    P3385 【模板】负环
  • 原文地址:https://www.cnblogs.com/canmeng-cn/p/8166084.html
Copyright © 2011-2022 走看看