zoukankan      html  css  js  c++  java
  • 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(); }
  • 相关阅读:
    hdu 2680(最短路)
    hdu 1548(最短路)
    hdu 1596(最短路变形)
    hdu 1546(dijkstra)
    hdu 3790(SPFA)
    hdu 2544(SPFA)
    CodeForces 597B Restaurant
    CodeForces 597A Divisibility
    CodeForces 598E Chocolate Bar
    CodeForces 598D Igor In the Museum
  • 原文地址:https://www.cnblogs.com/use-D/p/14147476.html
Copyright © 2011-2022 走看看