• ThreadLocal源码


    1、ThreadLocal可以通过为每个线程生成唯一的标识符,用于定位ThreadLocal中每个线程所保存的变量;

        public void set(T value) {
         //获得当前线程, Thread t = Thread.currentThread();
         //通过getMap方法获得实际每个线程自己存储key和value的Entry数组,即ThreadLocalMap变量;
         //可以理解为所有线程在TheadLocal中公用一个数组; ThreadLocalMap map = getMap(t); if (map != null)
           //this作为key,key通过key.threadLocalHashCode & (len-1);方式获得在数组中位置,
           //存在的话,替换value,日过
           //不存在的话,在指定数组位置新建Entry变量 map.set(this, value); else
           //如果ThreadLocalMap不存在,初始化一个长度为16的数组 createMap(t, value); }

    需要重点注意,key是继承了WeakReference的若引用对象,value为强引用对象,因此value有可能一直删除,造成内存泄漏,

    为方式value造成的内存泄漏可以,每次使用完remove。

    如下代码:

    static class Entry extends WeakReference<ThreadLocal> {
                /** The value associated with this ThreadLocal. */
                Object value;
    
                Entry(ThreadLocal k, Object v) {
                    super(k);
                    value = v;
                }
            }
    
        public T get() {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null) {
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null)
                    return (T)e.value;
            }
         //当前线程存储的值是有可能为null的,即当前线程没有set过值 return setInitialValue(); }
  • 相关阅读:
    JAVA内存结构解析
    Android(IPC)进程间通讯1:详解Binder由来?
    Python-快速排序算法
    扫描二维码、条形码,生成二维码
    ios常用方法
    UITableView定义等高的cell
    UITableView总结
    Swift——常量&变量
    iOS平台Cordova插件的开发方法
    自定义iWatch App点击Glance后的跳转页
  • 原文地址:https://www.cnblogs.com/use-D/p/14147476.html
Copyright © 2020-2023  润新知